【问题标题】:IE cookie quirksIE cookie 怪癖
【发布时间】:2009-03-13 23:58:48
【问题描述】:

我们面临以下检查在 IE 中间歇性失败的问题:

伪代码:

setCookie("name","value", "1d");
if(getCookie("name") === "value"){ 
  return SUCCESS;
} else {
  return FAILURE;
}

这个小程序检查用户是否启用了 cookie。它不应该失败,但确实如此。 是因为 IE 只能处理一定数量的 cookie 吗? (我们设置了很多 cookie)。

还有其他更可靠的 cookie 检查方法吗?

【问题讨论】:

    标签: javascript internet-explorer cookies


    【解决方案1】:

    是的,IE 对每个主机都有预设的 cookie 限制。之后,程序开始丢弃 cookie。更多信息请查看here...

    我建议您仅使用 cookie 来跟踪用户 ID,对于其他一切您应该使用“会话状态”之类的内容。

    【讨论】:

    • 就像我说的,您应该将您的用户数据存储在服务器上。例如,您可以使用“会话状态”、“视图状态”,或者在更极端的情况下只写入数据库。
    【解决方案2】:

    正如 bastos.sergio 所说,使用会话。

    也就是说,如果您有负载平衡的 Web 服务器,请忽略会话并在需要时直接从数据库服务器中提取数据。

    如果是单个网络服务器,则使用会话。

    无论如何,看看您存储的数据。域的所有 cookie 都会在每个 Web 请求上发送回来。所有会话数据也会为每个 Web 请求加载。

    如果您不需要每个网页的数据,则不应将其缓存在 cookie 或会话中,因为与仅在需要时提取数据相比,它实际上会导致更大的性能损失。

    这就是为什么通常存储在 cookie 或会话中的唯一内容是简单的项目,例如用户 ID。

    另外,我相信 IE 将网站限制为 20 个单独的 cookie,总共 4KB 的数据。
    http://support.microsoft.com/kb/306070

    更新:取消 20 个的限制。IE 5、6 和 7 支持最多 50 个 cookie,前提是应用了 2007 年 8 月的特定更新。 http://support.microsoft.com/kb/941495 但是,4KB 的限制仍然存在。

    请参阅this blog entry,其中确切说明了为什么大量使用 cookie 是一个坏主意。

    【讨论】:

      【解决方案3】:

      是不是因为IE只能处理一定数量的cookies?

      可能是,但这个限制非常高 — 远远超过您在实践中应该设置的。不要在 cookie 中放入大量数据;它们在每个 HTTP 请求上发送,从而减慢您的应用程序的速度。在 IE 上,您可以在 userData 中存储大量数据,而在较新的浏览器上,您可以使用 DOM Storage,无论哪种方式都不会产生 HTTP 开销。但是依赖这些并不是很好的兼容性。你真的需要在客户端存储那么多吗?对于通用网络应用程序,这可能表明您做错了。

      还有其他更可靠的 cookie 检查方法吗?

      不,差不多就是这样。请注意,您可能无法设置 cookie-with-expires-date 但成功设置会话 cookie(没有过期日期;浏览器关闭时过期)。这是因为在 IE 中,当您阻止持久性 cookie 时,它​​们会被完全阻止,而不是像在其他一些浏览器上那样降级为会话 cookie。因此,出于某些目的,您需要进行两次检查。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-13
        • 2013-02-25
        • 2011-02-23
        相关资源
        最近更新 更多