internet-explorer - Set-Cookie : Expire property, 时钟偏差和 Internet Explorer 问题

标签 internet-explorer http cookies

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

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

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

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

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

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

问题:

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

最佳答案

  • 将 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

关于internet-explorer - Set-Cookie : Expire property, 时钟偏差和 Internet Explorer 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16416241/

相关文章:

c# - 确定任何打开的 IE 窗口的 URL

ruby - ruby 中的 curl 请求

http - 这是 REST API 的有效映射吗?

java - 无效的 cookie header : Unable to parse expires attribute when expires attribute is empty

CSS 错误或 IE 兼容性问题?

javascript - jQuery 检测浏览器 IE9 及以下版本并抛出一个升级模式

c++ - 如何获取IWebBrowser2中加载的页面源?

ruby - 如何在 ruby​​ 中使用 Net::HTTP 正确使用 ca_file 作为自签名证书?

javascript - 未捕获的类型错误 : cannot call method 'cookie' of undefined

c - LibCURL 登录网站