在代码中创建cookie,从浏览器中删除cookie,页面仍然可以读取已删除的cookie。怎么样?

时间:2011-06-12 07:41:53

标签: c# asp.net cookies

我有以下C#代码,用于在cookie中记录用户的URL。如果cookie已存在,则会将新值附加到由管道字符分隔的现有值。我的ASPX页面查找此cookie,根据管道字符切换值并将它们绑定到网格。到现在为止还挺好。但是当我在浏览器中访问Internet选项并清除我的cookie,临时文件等并刷新页面时,页面仍然可以从cookie中读取值。看来cookie根本没有删除。无论如何,它都会被持久化。是什么赋予了?如果用户从浏览器中清除cookie,则ASPX中的网格控件应为空。该页面没有使用缓存或任何东西。

HttpCookie recentlyViewedCookie = Request.Cookies["RecentlyViewedCookie"];
        if (recentlyViewedCookie != null)
        {
            string value = recentlyViewedCookie.Value;
            value = string.Format("{0}|{1}*{2}", value, DateTime.Now.ToString("MM/dd/yyyy"), Request.Url.ToString());
            recentlyViewedCookie.Value = value;
            Response.Cookies.Add(recentlyViewedCookie);
        }
        else
        {
            recentlyViewedCookie = new HttpCookie("RecentlyViewedCookie");
            recentlyViewedCookie.Value = string.Format("{0}*{1}", DateTime.Now.ToString("MM/dd/yyyy"), Request.Url.ToString());
            recentlyViewedCookie.Expires = DateTime.Now.AddMonths(1);
            Response.Cookies.Add(recentlyViewedCookie);
        }

感谢您的回答。

2 个答案:

答案 0 :(得分:2)

问题在于这段代码:

    if (recentlyViewedCookie != null)
    {
        string value = recentlyViewedCookie.Value;
        value = string.Format("{0}|{1}*{2}", value, DateTime.Now.ToString("MM/dd/yyyy"), Request.Url.ToString());
        recentlyViewedCookie.Value = value;
        Response.Cookies.Add(recentlyViewedCookie);
    }

您没有设置Cookie的到期日期。如果cookie没有到期日期,它就是一个“会话cookie”并保存在内存中,直到浏览器关闭 - 它永远不会写入磁盘 - 因此从磁盘中删除所有cookie不会影响它。

您可能认为初始cookie创建的到期日期会持续存在,但事实并非如此。服务器无权访问原始cookie,也不知道过期设置的内容。所以它只是写了一个没有任何过期日期的set-cookie标题,将cookie变成了一个会话cookie。

答案 1 :(得分:1)

首先,不是一个很好的做法,要求您的用户清除所有Cookie ,以使您的网页运行正常。

其次,您没有说明您使用的浏览器,因为这是浏览器的一部分,当您清除Cookie时,您还需要关闭浏览器,或者至少没有打开您的页面(因为您说“刷新”这页纸”)。如果您已经清除了cookie,但是您已经在浏览器上打开了该页面,那么浏览器一直保留该页面的cookie - 是已经完成的渲染的一部分,是javascript全局的一部分该页面的值,因此cookie存在,直到您关闭和您的页面。清除所有cookie并不清楚活动内存,只需从缓存中删除所有cookie文件。

最后,我建议为您的页面流操作考虑不同的方法,而不是要求您的用户清除所有Cookie。