【问题标题】:ASP.NET Cookie Update Value Without Updating Expiration?ASP.NET Cookie 更新值而不更新过期?
【发布时间】:2017-05-15 21:36:05
【问题描述】:

是否可以更新 ASP.NET cookie 值而不必更新过期时间?我发现如果我尝试更新 Cookie 而不更新过期时间,则该 Cookie 将不再存在。我有以下代码,我正在尝试修改。如果每次更新 cookie 值时,过期有什么意义?

        HttpCookie cookie = HttpContext.Current.Request.Cookies[constantCookie];

        if (cookie == null)
            cookie = new HttpCookie(constantCookie);

        cookie.Expires = DateTime.Now.AddYears(1);
        cookie.Value = openClose;
        HttpContext.Current.Response.Cookies.Set(cookie);

【问题讨论】:

  • "如果每次 cookie 值都更新,那么过期有什么意义?" ——其实这就是你很多时候想要的。诸如“如果您一个月不访问,我们将忘记您”之类的场景,取决于您每次访问 cookie 都会在一个月后过期的事实。
  • 非常正确,在这一点上我绝对同意你的看法。

标签: asp.net cookies


【解决方案1】:

ASP.NET HttpCookie 类无法在从 HTTP 请求中读取 cookie 时初始化 Expires 属性(因为 HTTP 规范甚至不要求客户端首先将 Expiration 值发送到服务器)。而且,如果您在将 cookie 设置回 HTTP 响应之前没有设置 Expires 属性,那么它会将其转换为会话 cookie 而不是持久的。

如果您确实必须保持过期,那么您可以将初始过期日期设置为 cookie 值的一部分,然后当您读取 cookie 时,解析出该值并设置新的过期时间以匹配。

一个不包含任何其他数据的示例,因此 cookie 并没有真正的帮助——您必须以某种方式使用您要存储的实际数据对其进行序列化:

HttpCookie cookie = HttpContext.Current.Request.Cookies[constantCookie];
DateTime expires = DateTime.Now.AddYears(1);

if (cookie == null) {
    cookie = new HttpCookie(constantCookie);
} else {
    // cookie.Value would have to be deserialized if it had real data
    expires = DateTime.Parse(cookie.Value);  
}

cookie.Expires = expires;
// save the original expiration back to the cookie value; if you want to store
// more than just that piece of data, you would have to serialize this with the
// actual data to store
cookie.Value = expires.ToString();

HttpContext.Current.Response.Cookies.Set(cookie);

【讨论】:

  • 很好的答案,尽管它不只是 ASP.NET 不初始化到期日期 - 一般来说,cookie 到期日期是“只写”并且不会在 http 请求中向 Web 服务器公开。
  • 对我来说,虽然在服务器端 cookie 过期值不显示最后设置的值,但即使我只是更新 cookie 值并且没有过期,浏览器也会存储正确的值。
  • @mrbengi 这篇文章与 cookie 有关。您发布了一个关于 DateTime 解析如何工作的新问题。有很多资源可以找到帮助,或者通过 StackOverflow 页面右上角的链接提出新问题。但您的评论不适用于该主题。
  • @mrbengi 如果 cookie 值不是由其他系统创建或代码无效,则它可以正常工作。此外,为了简洁起见,代码示例通常会跳过基本的外部/用户输入清理处理,因为所有代码都应该有它,因此将它放在每个代码示例中会分散注意力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多