8

有一个标头 Max-Age 允许指定 cookie 的到期时间。不幸的是,Internet Explorer 6、7、8 和可能更高版本不支持 Max-Age,并且需要带有 GMT 绝对日期的 Expires 标头。

特定客户端上的 GMT 时间和 TZ 设置可能不正确的情况并不少见。考虑没有正确定义他的时区并手动调整时钟的用户。

不仅如此,有时可能会有很多分钟的显着时钟偏差,而用户没有意识到它们。

在这种情况下,它的 GMT 时间可能会偏移几个小时。实际上,它会阻止服务器设置任何需要短过期时间的 cookie。考虑如果 TZ 不正确,则永远不会设置最长 10 分钟的 cookie。

关于如何解决问题的原始想法(不起作用或有问题):

  1. 当然最好是使用 Max-Age 甚至同时指定两者,因为所有浏览器都会忽略“过期”部分 - 但它在 IE 中不起作用
  2. 我想到的另一种方法是设置 Date: header 希望 IE 会知道计算差异以解决时钟偏差......但这对 IE 没有帮助。
  3. 根据请求(使用 JavaScript)从客户端获取时间,然后计算时钟差异,然后根据需要调整 Expire 标头。然而,它需要复杂的数据操作,包括将时间提交给服务器的某种方式。

问题:

  1. 在 IE 中处理 cookie 的过期时间的最佳和常见做法是什么?
  2. 你如何在你的应用程序中做到这一点
4

4 回答 4

8
  • 将 Max-Age 设置为所有人,但 Microsoft 理解它。
  • 添加仅在 IE 上运行的 Javascript,以根据浏览器的时钟将 Max-Age 转换为 UTC,并在 cookie 上设置该过期时间。请注意,JavaScript 无法读取 cookie 中设置的 Max-Age,因此您必须以其他方式向 JavaScript 提供该信息(以及任何其他选项)。

来自QuirksMode

function readCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for(var i=0;i < ca.length;i++) {
    var c = ca[i];
    while (c.charAt(0)==' ') c = c.substring(1,c.length);
    if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
return null;
}

然后在你从某处获得 cookienamemaxAgeotherOptions(例如路径、域)之后:

var date = new Date();
date.setTime(date.getTime() + (maxAge * 1000));
document.cookie = name + "=" + readCookie(name) + 
    '; expires=' + date.toUTCString() + otherOptions
于 2013-05-12T01:16:56.037 回答
5

我所做的是将时间保持到服务器端。您永远无法确定客户端的时间,但您知道您的服务器永远不会说谎。

  • 您保留第一个请求在服务器上发生的时间(当您为每个客户端发送数据时保留服务器时间),并设置一个最大日期到期的 cookie,即:01/01/2900。
  • 你跟踪那个时间,让我们说 10 分钟的服务器时间,你决定它的时间来杀死它。
  • 然后,您将 cookie 设置为具有最小日期。即 1900 年 1 月 1 日。删除 cookie: http:
    //msdn.microsoft.com/en-us/library/ms178195 (v=vs.100).aspx
于 2013-05-16T09:37:22.363 回答
2

如果我有这种要求,我会在我的应用程序中管理 cookie。在 cookie 的内容中包含服务器时间过期时间戳,使用加密或散列保护 cookie,如果 cookie 中的时间戳已过去,则拒绝 cookie。

这几乎就是强制执行自动登录 cookie 过期的方式。

于 2013-05-16T07:13:39.727 回答
1

仅供参考,IE 11 从版本 11.0.15063.0 开始支持 cookie 的 Max-Age。

我找不到任何来自 Microsoft 的文档来报告这一点,但在开发过程中我们发现我们的本地版本的 IE 正在运行,但客户却没有。我们将其缩小到 IE 版本和 cookie 上的 Max-Age 属性的差异。

于 2017-05-10T21:57:17.900 回答