希瓦的守护

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

背景

最近做到一个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中却获取不到了,不知道园子里边有没有大神给分析一下啊。
辞职,敬礼

posted on 2016-06-11 00:18  希瓦的守护  阅读(7160)  评论(1编辑  收藏  举报