【问题标题】:Why is the cookie expiration date not surviving across sessions in ASP.NET?为什么 cookie 过期日期在 ASP.NET 中的会话中不存在?
【发布时间】:2014-01-30 22:07:08
【问题描述】:

我对测试平台页面做了一些更改,所以我可以在这里更清楚地说明我的问题。

页面有三个按钮:设置;清除;和得到。

设置有这个代码:

PreferredCookie = new HttpCookie("PreferredCookie");
PreferredCookie.Value = "Chocolate Chip";
DateTime exp = DateTime.Now.AddDays(1.0d);
PreferredCookie.Expires = exp;
Response.Cookies.Set(PreferredCookie);

清除有这个:

HttpCookie PreferredCookie = Request.Cookies["PreferredCookie"];
if (PreferredCookie != null)
{
    PreferredCookie.Value = "";
    PreferredCookie.Expires = DateTime.Now;
    Response.Cookies.Set(PreferredCookie);
}

Get 有这个,它输出到 asp:Literal:

HttpCookie PreferredCookie = Request.Cookies["PreferredCookie"];
if (PreferredCookie != null)
{
    CookieLiteral.Text = "Value = " + PreferredCookie.Value + "<br>";
    CookieLiteral.Text += "Expires = " + PreferredCookie.Expires.ToString("MM/dd/yyyy HH:mm:ss");
}
else
{
    CookieLiteral.Text = "<h2>No Cookie?</h2>";
}

如果我启动页面并单击清除,然后使用 Get 进行后续操作,我会看到:

没有 Cookie?

如果我然后单击 Set,然后单击 Get,我看到了:

价值 = 巧克力片
过期 = 01/01/0001 00:00:00

这个日期似乎被视为永不过期。如果我使用 Firefox 访问该页面,我会得到相同的结果。

【问题讨论】:

  • 这是您项目中唯一设置 cookie 的地方吗?
  • 是的,@MikeSmithDev。这是一个测试平台项目,仅用于尝试 cookie 处理。
  • 您如何确定 cookie 存在并且过期日期是从第 1 年开始?
  • @MikeSmithDev 我修改了问题以使其更清晰(我希望)并显示所有代码。

标签: asp.net cookies


【解决方案1】:

简短回答 - 您无法读取 cookie 的到期日期和时间。

略长一点的答案 - 这不是 ASP.NET 中的会话问题。这是您可以从 ASP.NET 中的 cookie 服务器端读取的内容的问题。 Per the MSDN:

浏览器负责管理 cookie,而 cookie 的 过期时间和日期有助于浏览器管理其 cookie 存储。 因此,虽然您可以读取 cookie 的名称和值,但您 无法读取 cookie 的到期日期和时间。当浏览器 向服务器发送cookie信息,浏览器不包含 过期信息。 (cookie 的 Expires 属性始终 返回零日期时间值。)

您可以读取您在 HttpResponse 对象,在 cookie 被发送到浏览器之前。 但是,您无法在 HttpRequest 对象中恢复过期时间。

所以基本上,cookie 的过期日期设置正确。这可以通过检查浏览器中的 cookie 来验证。不幸的是,像在 Get 函数中那样读取此 cookie 将返回 1/1/0001。

如果你真的想获得过期时间,那么你必须将它存储在 cookie 本身中:

设置

DateTime exp = DateTime.Now.AddDays(1);
HttpCookie PreferredCookie = new HttpCookie("PreferredCookie");
PreferredCookie.Values.Add("cookieType", "Zref");
PreferredCookie.Values.Add("exp", exp.ToString());
PreferredCookie.Expires = exp;
Response.Cookies.Set(PreferredCookie);

获取

HttpCookie PreferredCookie = Request.Cookies["PreferredCookie"];
if (PreferredCookie != null)
{
    CookieLiteral.Text = "Value = " + PreferredCookie["cookieType"] + "<br>";
    CookieLiteral.Text += "Expires = " + PreferredCookie["exp"];
}
else
{
    CookieLiteral.Text = "No Cookie";
}

【讨论】:

  • 天啊,一直以来(之前从未使用过 cookie,毕竟这些年来),我一直假设到期日期是可读的。我试图做的是验证 cookie 中的信息是否设置正确。在某种程度上,这有点尴尬。但我真诚地感谢你纠正我的误解!
  • 你不能相信任何关于 cookie 的东西,所以这在某种程度上是有道理的。充其量...如果浏览器确实发送了 cookie,您必须验证有关它的所有内容。结果,查看到期日期甚至没有意义,因为它不值得信赖。充其量,它只是一个客户端指示器,用于指示是否将 cookie 发送到服务器。
  • 希望我在两个小时前找到您的评论... :-) 花了几个小时试图弄清楚为什么我看不到 cookie 服务器端的到期!谢谢 MikeSmithDev!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-02
  • 2016-11-08
  • 2017-09-26
  • 1970-01-01
  • 2017-03-16
  • 2016-10-03
  • 2011-05-07
相关资源
最近更新 更多