问题 我的cookie什么时候会过期?


我在加利福尼亚州的服务器上运行了一个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)
};

由于Bob和服务器之间的时差,cookie会在24小时后到期,还是会在22小时后到期?我知道 DateTime.Now使用服务器的本地时间,但我不清楚浏览器如何确定cookie过期(具体来说,用什么时区来确定过期)。


12209
2017-07-20 21:17


起源

为什么不尝试2小时到期,看看它是否会立即到期? - Andreas Niedermair
@AndreasNiedermair部署产品很繁琐(即需要几个小时),我想知道在经历这种痛苦之前会发生什么。 - Rainbolt
制作一个小型演示应用,并使用具有不同时区的VM? - Andreas Niedermair
@AndreasNiedermair这是一个好主意。 - Rainbolt
Cookie将使用expires属性发送到浏览器,例如: Expires=Wed, 09 Jun 2021 10:18:14 GMT。我从来没有对它进行过测试,但是浏览器应该能够处理好这个并且在发送后24小时就会过期。 - David Sherret


答案:


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)可以被认为是相同的。您可以阅读更多相关信息 这里


11
2017-07-20 21:59



我将一个演示应用程序部署到我的开发机器上,并让另一个开发人员连接到它。他的机器比我早了两个小时,然后我设置了一个cookie过期 DateTime.Now.AddHours(2)。 Cookie没有立即过期,这与您在答案中描述的内容一致。感谢您在有关问题的评论中提出的有用建议。如果没有人反驳,我明天会接受你的回答。 - Rainbolt
@Rainbolt感谢你的编辑,但是真的不需要UT 通用时间戳  是指UTC(见 referencesource.microsoft.com/#mscorlib/system/...)。 - Andreas Niedermair
没问题。是的,我现在看到了 ToUniversalTime() 电话 ConvertTimeToUtc()。我的困惑的来源是术语,所以我希望答案有完全明确的术语(如果像我这样的其他人找到这个地方)。我以这种精神进行了另一次编辑,因为我不清楚什么是“通用时间戳”。 - Rainbolt
@Rainbolt太棒了,谢谢! - Andreas Niedermair