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

Art*_*yom 8 cookies internet-explorer http

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

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

更重要的是,有时可能存在很多分钟的显着时钟偏差,用户不知道它们.

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

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

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

问题:

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

Old*_*Pro 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;
}
Run Code Online (Sandbox Code Playgroud)

然后之后你得到的cookie name,并maxAgeotherOptions从什么地方(如路径,域):

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


Geo*_*kis 5

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

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