有一个 header Max-Age 允许指定 cookie 的过期时间。不幸的是,Internet Explorer 6、7、8 和可能更高版本不支持 Max-Age,并且需要带有 GMT 绝对日期的 Expires header 。
特定客户端上的 GMT 时间和 TZ 设置可能不正确的情况并不少见。考虑未正确定义时区并手动调整时钟的用户。
不仅如此,有时用户可能没有意识到许多分钟的显着时钟偏差。
在这种情况下,其 GMT 时间可能会偏移几个小时。实际上,它会阻止服务器设置任何 需要较短过期时间的 cookie。假设如果 TZ 不正确,则永远不会设置最长 10 分钟的 cookie。
关于如何解决问题的原始想法(不起作用或有问题):
- 当然最好是使用 Max-Age 甚至同时指定两者,因为所有浏览器都会忽略“过期”部分 - 但它在 IE 中不起作用
- 我想到的另一种方法是设置 Date: header,希望 IE 知道计算差异以解决时钟偏差...但这对 IE 没有帮助。
- 根据请求(使用 JavaScript)从客户端获取时间,然后计算时钟差异,然后根据需要调整 Expire header 。然而,它需要复杂的数据操作,包括将时间提交给服务器的某种方式。
问题:
- 在 IE 中处理 cookie 过期时间的最佳和常见做法是什么?
- 你是如何在你的应用程序中做到这一点的
最佳答案
- 将 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
关于internet-explorer - Set-Cookie : Expire property, 时钟偏差和 Internet Explorer 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16416241/