【发布时间】:2011-10-01 21:31:28
【问题描述】:
在我的网站中,当用户单击“注销”按钮时,Logout.aspx 页面会加载代码Session.Clear()。
在 ASP.NET/C# 中,这会清除所有 cookie 吗?或者是否需要添加任何其他代码来删除我网站的所有 cookie?
【问题讨论】:
标签: c# asp.net session cookies session-cookies
在我的网站中,当用户单击“注销”按钮时,Logout.aspx 页面会加载代码Session.Clear()。
在 ASP.NET/C# 中,这会清除所有 cookie 吗?或者是否需要添加任何其他代码来删除我网站的所有 cookie?
【问题讨论】:
标签: c# asp.net session cookies session-cookies
试试这样的:
if (Request.Cookies["userId"] != null)
{
Response.Cookies["userId"].Expires = DateTime.Now.AddDays(-1);
}
但是用起来也有意义
Session.Abandon();
除了在许多情况下。
【讨论】:
Session.Abandon 将清除 ASP.NET 会话 cookie,但不会清除您手动设置的 cookie,例如此处的 userID。 Cookies["whatever"] 永远不会为空;如果您要求一个不存在的 cookie,框架将创建一个 cookie。
Cookies["whatever"]在cookie不存在时返回null!我知道这是一条旧评论,但我不希望其他读者被这条评论误导。
Expires 未设置为 DateTime.MinValue 也很重要,因为这实际上会给 cookie 一个会话过期时间,这意味着它会等到浏览器/选项卡(取决于浏览器)关闭之前删除 cookie。
不可以,Cookie 只能由setting the Expiry date 为每个人清除。
if (Request.Cookies["UserSettings"] != null)
{
HttpCookie myCookie = new HttpCookie("UserSettings");
myCookie.Expires = DateTime.Now.AddDays(-1d);
Response.Cookies.Add(myCookie);
}
此刻Session.Clear():
Session 集合中的所有键值对都被删除。 Session_End 事件没有发生。如果在注销时使用此方法,还应使用Session.Abandon 方法
Session_End事件:
【讨论】:
if 行实际上不起作用。当您使用 Cookies["whatever"] 请求 cookie 时,如果它不存在,框架将创建一个 cookie。
Request 对象,它不会创建一个 cookie。
Response 对象创建了一个cookie。有趣:)
Response.Cookies["UserSettings"].Expires = DateTime.Now.AddDays(-1)即可优化。此处服务器将请求浏览器删除 cookie。如果存在,浏览器将删除它。
这是我用的:
private void ExpireAllCookies()
{
if (HttpContext.Current != null)
{
int cookieCount = HttpContext.Current.Request.Cookies.Count;
for (var i = 0; i < cookieCount; i++)
{
var cookie = HttpContext.Current.Request.Cookies[i];
if (cookie != null)
{
var expiredCookie = new HttpCookie(cookie.Name) {
Expires = DateTime.Now.AddDays(-1),
Domain = cookie.Domain
};
HttpContext.Current.Response.Cookies.Add(expiredCookie); // overwrite it
}
}
// clear cookies server side
HttpContext.Current.Request.Cookies.Clear();
}
}
【讨论】:
不幸的是,对我来说,设置“过期”并不总是有效。 cookie 不受影响。
这段代码对我有用:
HttpContext.Current.Session.Abandon();
HttpContext.Current.Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
其中"ASP.NET_SessionId" 是cookie 的名称。这并没有真正删除 cookie,而是用一个空白 cookie 覆盖它,这对我来说已经足够接近了。
【讨论】:
我只想指出,正如其他人所说,使用 Session.Abandon 时不会删除 Session ID cookie。
当您放弃会话时,会话 ID cookie 不会从 用户的浏览器。因此,会议一结束 放弃,对同一应用程序的任何新请求都将使用相同的 会话 ID,但会有一个新的会话状态实例。同时 时间,如果用户在同一个 DNS 中打开另一个应用程序 域,用户在 Abandon 后不会丢失会话状态 从一个应用程序调用方法。
有时,您可能不想重复使用会话 ID。如果你这样做并且如果 您了解不重用会话 ID 的后果,请使用 以下代码示例放弃会话并清除 会话 ID cookie:
Session.Abandon(); Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));此代码示例从服务器清除会话状态并设置 会话状态 cookie 为空。空值有效清除 来自浏览器的 cookie。
【讨论】:
现在是 2018 年,所以在 ASP.NET Core 中,有一个直截了当的内置函数。要删除 cookie,请尝试以下代码:
if(Request.Cookies["aa"] != null)
{
Response.Cookies.Delete("aa");
}
return View();
【讨论】:
您永远不应将密码存储为 cookie。要删除 cookie,您实际上只需要修改并使其过期。您不能真正删除它,即将它从用户的磁盘中删除。
这是一个示例:
HttpCookie aCookie;
string cookieName;
int limit = Request.Cookies.Count;
for (int i=0; i<limit; i++)
{
cookieName = Request.Cookies[i].Name;
aCookie = new HttpCookie(cookieName);
aCookie.Expires = DateTime.Now.AddDays(-1); // make it expire yesterday
Response.Cookies.Add(aCookie); // overwrite it
}
【讨论】:
以OP的问题标题为删除所有cookie-“删除网站中的cookie”
我在网上某个地方看到了 Dave Domagala 的代码。我编辑了 Dave's 以允许谷歌分析 cookie - 它遍历网站上找到的所有 cookie 并将它们全部删除。 (从开发人员的角度来看 - 将新代码更新到现有网站中,是避免用户重新访问该网站时出现问题的好方法。
我使用下面的代码首先读取 cookie,保存任何所需的数据 - 然后在使用下面的循环清洗所有内容后重置 cookie。
代码:
int limit = Request.Cookies.Count; //Get the number of cookies and
//use that as the limit.
HttpCookie aCookie; //Instantiate a cookie placeholder
string cookieName;
//Loop through the cookies
for(int i = 0; i < limit; i++)
{
cookieName = Request.Cookies[i].Name; //get the name of the current cookie
aCookie = new HttpCookie(cookieName); //create a new cookie with the same
// name as the one you're deleting
aCookie.Value = ""; //set a blank value to the cookie
aCookie.Expires = DateTime.Now.AddDays(-1); //Setting the expiration date
//in the past deletes the cookie
Response.Cookies.Add(aCookie); //Set the cookie to delete it.
}
补充:如果您使用 Google Analytics
上述循环/删除将删除该站点的所有 cookie,因此如果您使用 Google Analytics - 保留 __utmz cookie 可能会很有用,因为该 cookie 会跟踪访问者的来源、搜索引擎是什么使用的链接、点击的链接、使用的关键字以及访问您的网站时它们在世界上的哪个位置。
因此,为了保留它,一旦知道 cookie 名称,就包装一个简单的 if 语句:
...
aCookie = new HttpCookie(cookieName);
if (aCookie.Name != "__utmz")
{
aCookie.Value = ""; //set a blank value to the cookie
aCookie.Expires = DateTime.Now.AddDays(-1);
HttpContext.Current.Response.Cookies.Add(aCookie);
}
【讨论】:
虽然这是一个旧线程,但我想如果有人仍在寻找未来的解决方案。
HttpCookie mycookie = new HttpCookie("aa");
mycookie.Expires = DateTime.Now.AddDays(-1d);
Response.Cookies.Add(mycookie1);
这就是我的诀窍。
【讨论】:
Response.Cookies["UserSettings"].Expires = DateTime.Now.AddDays(-1)
【讨论】:
您必须设置过期日期才能删除 cookie
Request.Cookies[yourCookie]?.Expires.Equals(DateTime.Now.AddYears(-1));
如果 cookie 不存在,这不会引发异常。
【讨论】:
如果有人喜欢,我强烈更喜欢这个。
string COOKIE_NAME = "COOCKIE NAME"
if (HttpContext.Request.Cookies.AllKeys.Contains(COOKIE_NAME))
{
HttpCookie Cookie = HttpContext.Request.Cookies[COOKIE_NAME];
engagementIdCookie.Expires = DateTime.Now.AddDays(-1);
Response.Cookies.Add(Cookie);
}
【讨论】: