Internet explorer 设置Cookie:过期属性、时钟偏移和Internet Explorer问题

Internet explorer 设置Cookie:过期属性、时钟偏移和Internet Explorer问题,internet-explorer,http,cookies,Internet Explorer,Http,Cookies,有一个允许指定cookie过期时间的标头Max Age。不幸的是,Internet Explorer 6、7、8以及可能更高版本不支持最大年龄,并且要求Expires标头以GMT为绝对日期 特定客户端上的GMT时间和TZ设置可能不正确,这种情况并不少见。考虑没有正确定义时区的用户,手动调整时钟。 更重要的是,有时可能会出现明显的时钟偏移,即用户不知道的几分钟 在这种情况下,其格林尼治标准时间可能会移动到几个小时。它可以有效地防止服务器设置任何需要较短过期时间的cookie。如果TZ是不正确的,考

有一个允许指定cookie过期时间的标头Max Age。不幸的是,Internet Explorer 6、7、8以及可能更高版本不支持最大年龄,并且要求Expires标头以GMT为绝对日期

特定客户端上的GMT时间和TZ设置可能不正确,这种情况并不少见。考虑没有正确定义时区的用户,手动调整时钟。 更重要的是,有时可能会出现明显的时钟偏移,即用户不知道的几分钟

在这种情况下,其格林尼治标准时间可能会移动到几个小时。它可以有效地防止服务器设置任何需要较短过期时间的cookie。如果TZ是不正确的,考虑一个最大年龄为10分钟的曲奇饼永远不会被设置。

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

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

  • 在IE中处理cookie过期时间的最佳和常见做法是什么
  • 如何在应用程序中实现这一点
    • 将最大年龄设置为除Microsoft以外的所有人都能理解的年龄
    • 添加仅在IE上运行的Javascript,以根据浏览器的时钟将最大年龄转换为UTC,并在cookie上设置过期时间。请注意,JavaScript无法读取cookie中设置的最大年龄,因此您必须以其他方式向JavaScript提供该信息(以及任何其他选项)


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


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

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

    • 保留第一个请求在服务器上发生的时间(保留 服务器时间(当您为每个客户端发送数据时),并使用 a最长到期日,即:01/01/2900
    • 您可以跟踪这段时间,比如说10分钟的服务器时间 你决定杀了它
    • 然后将cookie设置为具有最小日期。i、 e.1900年1月1日。 删除Cookie:

    仅供参考,IE 11支持从11.0.15063.0版开始的cookie的最大年龄


    我找不到Microsoft的任何文档来报告这一点,但在开发过程中,我们发现我们的本地版本的IE正在工作,但客户却没有。我们把它缩小到伊江版本和Cookie席上的Max AGE属性的差异。

    “考虑一个最大年龄为10分钟的cookie”——在所描述的条件下很难解决。我宁愿将服务器端时间存储到cookie中,直到该值被认为是有效的(并将其设置为更长的时间范围)-然后,如果您仍然想将其值用于某些事情,则可以在再次接收该cookie时检查服务器端…我理解10分钟是一个很短的时间。但在任何情况下,即使您需要30分钟,这仍然可能是一个大问题。一般来说,我们要么设置会话cookie,它只持续到浏览器退出,要么设置cookie的过期日期是几天或几年以后,这样时区问题就不成问题。
    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;
    }
    
    var date = new Date();
    date.setTime(date.getTime() + (maxAge * 1000));
    document.cookie = name + "=" + readCookie(name) + 
        '; expires=' + date.toUTCString() + otherOptions