asp.net 我的cookie何时到期?

axzmvihb  于 2023-02-17  发布在  .NET
关注(0)|答案(2)|浏览(152)

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

  • 2015年7月20日14:00协调世界时-08:00

Bob已连接到我的服务器。Bob在德克萨斯州。他的当前时间是:

  • 2015年7月20日16:00协调世界时-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小时后过期,还是会在22小时后过期,因为Bob和服务器之间的时差?我知道DateTime.Now uses the server's local time,但我不清楚浏览器如何确定Cookie过期(具体来说,使用哪个时区来确定过期)。

oaxa6hgo

oaxa6hgo1#

Cookie确实包含带有expires标头的时区信息(大多数是GMT),这使得客户端科普与服务器实际时区的偏移非常简单。
示例:expires=Mon,20-Jul-2015 22:00:00 GMT如果2015-07-20 14:00:00 UTC-8是服务器的时间,则返回expires=Mon,20-Jul-2015 22:00:00 GMT。当客户端或服务器决定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的信息。

qij5mzcb

qij5mzcb2#

您的cookie将在完全相同的时间对所有人过期...

......只是根据时区在时钟上显示不同的本地时间。因此,例如,在加州州和得克萨斯州完全相同的时刻获取Cookie的用户,这些用户将看到他们的Cookie在相同的时刻过期,只是不是他们时钟上显示的同一时间。对鲍勃来说是4:pm,但在加州是2:pm。同一时间点,只是每个人在一天中不同的时间使用你的网站的不同时钟。
Cookie都以UTCUniversal Coordinated Time保存 DateTime 过期值,UTCUniversal Coordinated Time位于英国伦敦格林威治(英国)。当用户在浏览器中存储Cookie时,所有Cookie的到期日期-时间均采用ISO-UTC格式,并在末尾带有“Z”或“GMT”,以表明他们使用的是此UTC值。尽管在世界各地,不同的本地时间可能会使这些日期-时间看起来不同,它们包含一个将它们Map回UTC的偏移量。这意味着当您在不同时区的同一时间为两个不同用户设置DateTime时,它们将在同一时间点过期,只是两个时区的时钟上显示的本地时间不同。
然而...
如果你想让每个人的cookie在相对于他们时区的午夜到期,那么是的,你首先需要使用 JavaScript 获得他们本地计算机的本地时间午夜,然后将其转换为UTC。使用document.cookie创建一个JavaScript cookie。现在他们有一个cookie,只在他们时区的午夜到期。

另一个选择...

如果你想让世界上的每个人都有一个相对于特定时区时钟在比如加州州午夜到期的cookie,那么是的...你需要得到你想让世界上其他人在你的cookie逻辑中使用的加利福尼亚州的确切日期时间,并将其转换为UTC日期时间。然后将其设置为所有访问您网站的用户cookie的cookie过期时间。当加州州的午夜到来时,世界各地所有人的cookie将再次在同一时间过期,但使用与加利福尼亚州午夜相同的UTC值。

相关问题