背景
最近做到一個asp.net項目,項目中保存用戶信息用到了cookie,因此,在注銷身份的時候,就需要清除掉cookie。
探索過程
我先是試驗了這種代碼,在沒有特殊聲明前,代碼都是寫在Page_Load方法中,
this.Response.Cookies.Clear();
事實證明,這是木有效果的。。。
然后我想到了我以前看到的書里講到的,可以通過設置過期時間為過去,以刪除cookie,所以我修改了代碼:
foreach (HttpCookie item in this.Response.Cookies)
{
item.Expires = DateTime.Now.AddDays(-1);
}
這樣寫有效果了,但是發現只是清除了一部分我希望清楚的cookie。。。尼瑪!!
然后我就調試檢查問題,發現在Response.Cookies的集合里邊,並沒有全部包括我要清除的cookie,反而是在Request.Cookies集合里邊全部包含了,我中間還因此把以上代碼中的
Response改寫成Request,結果一個沒有清楚掉。。。基礎不牢的錯
好吧,我的目的很簡單:
1.找到我要清楚的cookie的key,這個從Request中我可以獲取到
2.清楚瀏覽器cookie,這個我可以通過設置response的Cookie的過期時間為過去時間來達到
頭腦里邊整理下思路,果斷這樣寫來進行測試了:
for (int i = 0; i < this.Request.Cookies.Count; i++)
{
this.Response.Cookies[this.Request.Cookies[i].Name].Expires = DateTime.Now.AddDays(-1);
}
結果OK,算是搞定了,想到我是不是應該稍微封裝下,以方便以后使用,於是就封裝到了一個工具類方法里邊,具體請查看下邊的代碼;
代碼
/// <summary>
/// 清除指定cookie
/// </summary>
/// <param name="contenxt">The contenxt.</param>
/// <param name="cookies">The cookies.</param>
public static void ClearCookies(HttpContext contenxt,params string[] cookies)
{
//清除cookies
foreach (string key in cookies)
{
contenxt.Response.Cookies[key].Expires = DateTime.Now.AddDays(-1);
}
}
/// <summary>
/// 清空所有cookie
/// </summary>
/// <param name="contenxt">The contenxt.</param>
public static void ClearCookiesAll(HttpContext contenxt)
{
//清除cookies
for (int i = 0; i < contenxt.Request.Cookies.Count; i++)
{
contenxt.Response.Cookies[contenxt.Request.Cookies[i].Name].Expires = DateTime.Now.AddDays(-1);
}
}
疑問
最后,其實我還是有疑問的,為什么在Request中可以獲取到的cookie,在response中卻獲取不到了,不知道園子里邊有沒有大神給分析一下啊。
辭職,敬禮