【问题标题】:When will my cookie actually expire?我的 cookie 什么时候真正过期?
【发布时间】:2015-10-10 03:59:54
【问题描述】:

我有一个在加利福尼亚的服务器上运行的 ASP.NET 应用程序。服务器的当前时间是:

  • 7/20/2015 14:00 UTC-08:00

Bob 已连接到我的服务器。鲍勃在德克萨斯。他现在的时间是:

  • 7/20/2015 16:00 UTC-06:00

我的应用程序创建一个 cookie 并设置它的到期日期。

var name = "MyName";
var value = "MyValue"
var hoursToLive = 24;

var myCookie = new HttpCookie(name )
{
    Value = value,
    Expires = DateTime.Now.AddHours(hoursToLive)
};

cookie 会在 24 小时后过期,还是会因为 Bob 和服务器之间的时差而在 22 小时后过期?我知道DateTime.Now uses the server's local time,但我不清楚浏览器如何确定 cookie 已过期(具体而言,使用哪个时区来确定过期)。

【问题讨论】:

  • 为什么不试试2小时过期,看看是不是马上过期?
  • @AndreasNiedermair 部署产品很乏味(即需要几个小时),我想知道在经历这种痛苦之前会发生什么。
  • 制作一个小演示应用,并使用具有不同时区的虚拟机?
  • @AndreasNiedermair 这是个好主意。
  • Cookies 被发送到带有 expires 属性的浏览器,例如:Expires=Wed, 09 Jun 2021 10:18:14 GMT。我从未测试过它,但浏览器应该能够处理它并在发送后 24 小时内过期。

标签: c# asp.net cookies


【解决方案1】:

Cookie 确实包含带有 expires 标头(主要是 GMT)的时区信息,这使得客户端可以非常简单地处理与服务器实际时区的偏移量。

例如:expires=Mon,20-Jul-2015 22:00:00 GMT 如果2015-07-20 14:00:00 UTC-8 是服务器的时间。当客户端或服务器决定 cookie 是否过期时,会将其与关联的 GMT 时间进行比较。

我深入挖掘了System.Web.HttpCookie的代码,在GetSetCookieHeader()找到了相关代码:

        if (_expirationSet && _expires != DateTime.MinValue) {
            s.Append("; expires=");
            s.Append(HttpUtility.FormatHttpCookieDateTime(_expires));
        }

HttpUtility.FormatHttpCookieDateTime() 返回一个 UTC 时间戳(没有偏移,这无关紧要,因为偏移为零)。

在大多数情况下,格林威治标准时间 (GMT) 和协调世界时 (UTC) 可以被视为相同。你可以阅读更多关于这个here的信息。

【讨论】:

  • 我在我的开发机器上部署了一个演示应用程序,并让另一个开发人员连接到它。他的机器比我的机器早两个小时,我设置了一个 cookie 在DateTime.Now.AddHours(2) 之后过期。 cookie 没有立即过期,这与您在答案中描述的一致。感谢您在 cmets 中就该问题提出的有益建议。如果没有人反驳,我明天会接受你的回答。
  • @Rainbolt 感谢您的编辑,但实际上并不需要 UT,因为 通用时间戳 表示 UTC(请参阅 referencesource.microsoft.com/#mscorlib/system/…)。
  • 没问题。是的,我现在看到ToUniversalTime() 调用ConvertTimeToUtc()。我困惑的根源是术语,所以我希望答案有完全清楚的术语(以防像我这样的其他人找到这个地方)。我本着这种精神进行了另一次编辑,因为我不清楚什么是“通用时间戳”。
猜你喜欢
  • 2012-05-28
  • 2011-05-07
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多