Set-Cookie:过期属性,时钟偏差和Internet Explorer问题

时间:2013-05-07 09:59:50

标签: internet-explorer http cookies

标题Max-Age允许指定cookie的到期时间。不幸的是,Internet Explorer 6,7,8以及之后可能不支持Max-Age,并要求Expires标题的格式为GMT绝对日期。

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

更重要的是,有时可能会有很长时间的显着时钟偏差,用户不知道它们。

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

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

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

    1. 在IE中处理Cookie过期时间的最佳和常见做法是什么?
    2. 如何在您的应用程序中执行此操作

4 个答案:

答案 0 :(得分: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;
}

然后从某个地方获得Cookie namemaxAge以及otherOptions(例如路径,域名):

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

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

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