在我的网站上,当用户单击“注销”按钮时,Logout.aspx页面将加载代码Session.Clear()
。
在ASP.NET/C#中,这会清除所有cookie吗?还是需要添加任何其他代码来删除我网站的所有cookie?
Answers:
尝试这样的事情:
if (Request.Cookies["userId"] != null)
{
Response.Cookies["userId"].Expires = DateTime.Now.AddDays(-1);
}
但这也很有意义
Session.Abandon();
除了在许多情况下。
Cookies["whatever"]
当cookie不存在时实际上返回null!我知道这是一个旧评论,但我不希望其他读者被此评论误导。
Expires
是,不要将其设置为,DateTime.MinValue
因为这实际上会使cookie的Session期满,这意味着它要等到浏览器/选项卡(与浏览器相关)关闭后才能删除cookie。
不可以,只有通过设置每个Cookie的到期日期才能清除它们。
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();
}
}
我只想指出,如其他人所述,使用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设置为null。null值有效地从浏览器清除cookie。
您永远不应将密码存储为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的“在网站上删除Cookies”
我在网上某处遇到了Dave Domagala的代码。我编辑了Dave,也允许使用Google Analytics(分析)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名称后包装一个简单的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);
}
Response.Cookies [“ UserSettings”]。Expires = DateTime.Now.AddDays(-1)
Session.Abandon
将清除ASP.NET会话cookie,但不会清除您手动设置的cookie,例如此处的userID。而且Cookies["whatever"]
永远不会为空;如果您要求一个不存在的cookie,框架将创建一个cookie。