【问题标题】:Set-Cookie: Expire property, clock skew and Internet Explorer issueSet-Cookie:过期属性、时钟偏差和 Internet Explorer 问题
【发布时间】:2013-05-01 05:47:17
【问题描述】:

有一个标头 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. 如何在您的应用程序中做到这一点

【问题讨论】:

  • “考虑一个最长 10 分钟的 cookie”——在所描述的条件下很难解决这个问题。我宁愿存储 server-side 时间,直到该值也应被视为有效到 cookie 中(并将其设置为更长的时间范围) - 然后您可以检查 server-side when如果您仍然想将它的价值用于某事,是否再次接收该 cookie……
  • 我明白 10 分钟是很短的时间。但无论如何,即使你需要 30 分钟,它仍然可能是个大问题。
  • 一般来说,我们要么设置会话cookie,它只持续到浏览器退出,要么我们设置过期日期为未来几天或几年的cookie,因此时区问题不是问题。

标签: internet-explorer http cookies


【解决方案1】:
  • 将 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;
}

然后在您从某处获得 cookie name 和 maxAge 和 otherOptions(例如路径、域)之后:

var date = new Date();
date.setTime(date.getTime() + (maxAge * 1000));
document.cookie = name + "=" + readCookie(name) + 
    '; expires=' + date.toUTCString() + otherOptions

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      • 您保留第一个请求在服务器上发生的时间(保留 每个客户端发送数据时的服务器时间),并且您设置了一个 cookie 最长到期日期,即:01/01/2900。
      • 您跟踪该时间,假设服务器时间为 10 分钟 你决定是时候杀死它了。
      • 然后您将 cookie 设置为具有最小日期。即 01/01/1900。 删除 cookie :
        http://msdn.microsoft.com/en-us/library/ms178195(v=vs.100).aspx

      【讨论】:

        【解决方案4】:

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

        我找不到任何来自 Microsoft 的文档来报告此问题,但在开发过程中我们发现本地版本的 IE 可以正常工作,但客户却不能。我们将其缩小到 IE 版本和 cookie 上的 Max-Age 属性的差异。

        【讨论】:

          猜你喜欢
          • 2011-01-02
          • 1970-01-01
          • 1970-01-01
          • 2012-07-15
          • 1970-01-01
          • 2011-10-28
          • 2012-12-12
          • 2012-01-02
          • 1970-01-01
          相关资源
          最近更新 更多