会话更改或无效时不会删除HttpCookie

时间:2010-07-20 17:58:56

标签: asp.net session cookies httpcookie

我正在创建一个HttpCookie,只设置名称和值而不是expires属性,然后将其添加到响应中。很简单。 cookie按预期创建(但不是持久化)。问题是当会话因某种原因发生变化时(比如网站重建,或者我在调试时重建了我的应用程序),那么cookie就会存在。我希望cookie仅对其创建的原始会话有效。

根据MSDN,它说:“如果您没有为cookie指定过期限制,则cookie不会持久保存到客户端计算机,并且会在用户会话到期时过期。”

我想我不确切知道“会话到期”包含什么。我认为会话到期后20分钟后会删除cookie。但是,如果cookie被创建的会话因任何原因而不再存在,那么它是否会被删除?我看到cookie被删除的唯一一次是当用户关闭所有浏览器窗口并打开一个新窗口时。

如果这一切都是真的,我可能必须在cookie中存储原始会话ID(“ASP.NET_SessionId”),然后根据当前会话ID检查它,如果它们不同,则删除cookie或创建一个新的。

这是代码(我的cookie和MSDN示例中的唯一区别是我在cookie中存储了多个值):

private void SaveValuesToCookie(string[] names, string[] values)
{
    HttpCookie cookie = new HttpCookie("MyCookie");

    for (int i = 0; i < names.Length; i++)
    {
        string name = names[i];
        cookie.Values[name] = values[i];
    }
    Response.Cookies.Add(cookie);
}

private string GetValueFromCookie(string name)
{
    HttpCookie cookie = Request.Cookies["MyCookie"];
    if (cookie == null)
        return null;

    return cookie.Values[name];
}

2 个答案:

答案 0 :(得分:3)

  

我唯一一次看到cookie了   删除是用户关闭全部   浏览器窗口并打开一个新窗口。

这正是MSDN在会话到期时表示会删除cookie的含义。不幸的是,无论如何,我认为这在浏览器中是不一致的,因此对任何人都没有多大用处。

您应始终在Cookie上设置到期日。

  

如果这一切都是真的,我可能不得不这样做   存储原始会话ID   (“ASP.NET_SessionId”)在cookie中,   然后检查当前   会话ID,如果它们不同,那么   删除cookie或创建一个新的。

我讨厌说出来,但这也不会对你有所帮助。 .NET Framework喜欢回收会话ID,因此您无法保证它会有所不同。

不好的消息,我建议你从架构的角度重新考虑你想要做的事情。

重新启动应用程序完全在服务器上发生; cookie是完全在客户端上发生的事情。虽然客户端将与服务器通信,但它纯粹是请求/响应关系,服务器无法将应用程序重启等事件传递给浏览器。

如果你想在一个只对服务器会话的生命周期有效的某个地方存储一个值,为什么不把它存储在Session而不是Cookie中呢?

答案 1 :(得分:0)

我知道这一切,但它不足以满足我们客户的需求。会话仍然可以被欺骗或注入。请参阅:http://msdn.microsoft.com/en-us/magazine/cc163730.aspx#S9

看起来我只剩下创建一个与会话分开的过期安全cookie,并在我可以的时候刷新过期日期(即用户访问某些页面时)。