Asp.Net - 如何使Cookie过期

5
尝试过
 if (Request.Cookies["IsGuest"] != null)
     {
       Response.Cookies["IsGuest"].Expires = DateTime.Now.AddDays(-1);
       //HttpCookie myCookie = new HttpCookie("IsGuest");
       //myCookie.Expires = DateTime.Now.AddDays(-1d);
       //Response.Cookies.Add(myCookie);
     }
    string a = Request.Cookies["IsGuest"].Value;

我也尝试了通过注释未注释的代码和取消注释已注释的代码,但是...

 string a = Request.Cookies["IsGuest"].Value;

始终运行且 Request.Cookies["IsGuest"] 从未为 null


https://dev59.com/_Ww15IYBdhLWcg3wZ64Y https://dev59.com/EG865IYBdhLWcg3wl_s3 - JSHunjan
1
这不是我的情况,评论者。 - Imad
3个回答

7
你已经掌握了编程中删除cookie的正确概念:
HttpCookie myCookie = new HttpCookie("IsGuest"); 
cookie.Expires = DateTime.Now.AddDays(-1d); 
Response.Cookies.Add(cookie);

然而,您错过了一个要点。上述更改在回发完成并随后用户发起新请求之前不会生效

MSDN说:

下次用户向设置cookie的域或路径中的页面发出请求时,浏览器将确定cookie已过期并将其删除。

因此,下面的代码更详细地说明了这一点:

protected void DeleteCookie_ButtonClick(object sender, EventArgs e)
    {
        if (Request.Cookies["IsGuest"] != null)
        {
            HttpCookie myCookie = new HttpCookie("IsGuest"); 
            myCookie.Expires = DateTime.Now.AddDays(-1d); 
            Response.Cookies.Add(myCookie);
        }
        
        // this will always be true here as the Request i.e HttpRequest isn't 
        // modified actually as the postback isn't complete and we are accessing 
        // the Cookies collection of same request (not a new request)
        if (Request.Cookies["IsGuest"] != null)
        {
            Label1.Text = "Cookie Collection can't be modified without 
                           making a new request";
        }

    }
    
   // suppose after postback completes, 
   // user clicks a button to check the cookie, 
   // which in turn is a new request/postback/....
    protected void CheckCookie_ButtonClick(object sender, EventArgs e)
    {
        if (Request.Cookies["IsGuest"] != null)
        {
            Label1.Text = "Cookie is present!";                
        }
        else
        {
            Label1.Text = "No Cookie is present!";                
        }
    }

最后一点注意事项:

调用Cookies集合的Remove方法会在服务器端删除cookie,因此该cookie将不会发送到客户端。但是,如果cookie已经存在于客户端,则该方法不会从客户端中删除cookie。


1
非常好的解释 :) 感谢您提供如此棒的答案 :) - Imad
我们可以从Web配置中设置Cookie的过期时间吗? - AuserP
@AuserP:网站范围的Cookie设置通过Web.config元素<httpCookies />应用。但是,该元素没有任何属性来指定Cookie的超时时间。此外,对于特定于Asp.net的Cookie(如Forms身份验证Cookie),您可以使用<forms />元素,属性名称:timeout。对于Asp.net会话Cookie,情况也是如此,web.config元素:<sessionState />简而言之,对于在代码中创建的(自定义)Cookie,在web.config中不存在超时设置。请注意,用户会话(即会话Cookie)可能会过期,但不一定是通过代码创建的Cookie。 - R.C

0

如何使Cookie过期(在客户端)

我不会依赖ASP.NET Core来删除或使Cookie过期,因为服务器端与浏览器上发生的事情关系很小。ASP.NET应用程序和服务器也不知道每个过时Cookie的名称、分配的路径、是否已经过期、哪些Cookie名称不再使用旧网站、哪些Cookie被重命名、哪些是需要保留的会话Cookie等等。

最好在客户端控制Cookie,这意味着运行JavaScript(不幸的是)。

为此,我建议您自己编写Cookie过期例程。下面是我使用的一个例子,它删除顶级根路径Cookie和从调用脚本的文件夹开始的子路径下的Cookie。这通常意味着大多数Cookie都将被删除。有一些关于浏览器如何删除子路径下过期Cookie的奇特规则,我不会深入讨论。在某些情况下,可能会错过一些子路径。但总的来说,根Cookie都将过期,并且具有相同脚本Web路径及其所有子路径的任何Cookie也将过期。

下面的脚本仅对与上述规则匹配的路径设置过期日期的 Cookie 进行设置。但是浏览器也会将位于上述子路径下的 Cookie 设为过期状态。请在不同的浏览器中进行测试,并根据需要自定义脚本。这将不会删除存储为 Cookie 的会话!
// Get all cookies for this domain but by name-value pairs:
alert('What cookies do I have (name-value)?\r\n ' + document.cookie);

// Get all cookies
var allcookies = document.cookie;

// Splits into multiple cookies
var cookiesArray = allcookies.split(";");

// Loop through each found cookie...
if (cookiesArray && cookiesArray.length >= 0){
    for (var i = 0; i < cookiesArray.length; i++) {

        var nameString = "";
        var pathString = "";
        var expiresString = "";

        // Strip out all whitespace or formatting from the name-value pair...
        var cookieCleaned = cookiesArray[i].replace(/^\s+|\s+$/gm, '').replace(/[\t\n\r]/gm, '')

        namePair = cookiesArray[i].split("=");
        nameString = namePair[0] + "=; ";// empty the name's value

        const earlydate = new Date(0).toUTCString();
        expiresString = "expires=" + earlydate;

        // DELETE COOKIES using ROOT PATH and SUBPATH
        if (namePair[0] !== ""){

            // Reset the cookie subpath with new expiration date
            // to force the browser cache to delete it.
            var pathname = location.pathname.replace(/\/$/,'');
            if (pathname !== '') {
                pathname = "path=" + pathname + "; ";
                document.cookie = nameString + pathname + expiresString;
                alert('Final Cookie1:\r\n ' + nameString + pathname + expiresString);
            }

            // Reset the cookie rootpath, same as above.
            document.cookie = nameString + "path=/; " + expiresString;
            alert('Final Cookie2:\r\n ' + nameString + "path=/; " + expiresString);
        }
    }
}

-2

最好从您的列表中删除cookie


怎么做呢?没有像cookie.Remove()这样的东西。 - Imad
Response.Cookies.Clear() - Ajay Peter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接