我们正面临一个问题,即以下检查在IE中间歇性地失败:
伪代码:
setCookie("name","value", "1d");
if(getCookie("name") === "value"){
return SUCCESS;
} else {
return FAILURE;
}
这个小例程检查用户是否启用了cookie。它不应该失败,但确实如此。 是因为IE只能处理一定数量的cookie吗? (我们设置了很多cookie)。
还有其他方法可以进行更可靠的Cookie检查吗?
答案 0 :(得分:2)
是的,IE每个主机都有预设的cookie限制。之后程序开始丢弃cookie。查看here了解详情......
我建议您仅使用使用Cookie来跟踪用户ID,以及其他应该使用“会话状态”的内容。
答案 1 :(得分:1)
正如bastos.sergio所说,使用会话。
也就是说,如果您有负载均衡的Web服务器,请忽略会话并在需要时直接从数据库服务器中提取数据。
如果是单个Web服务器,则使用session。
无论如何,请查看您正在存储的数据。域的所有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是个坏主意。
答案 2 :(得分:1)
是因为IE只能处理一定数量的cookie吗?
可能是,但是这个限制非常高 - 比你在实践中设定的方式更多。不要在cookie中放入大量数据;它们在每个HTTP请求上发送,从而减慢您的应用程序速度。在IE上,您可以在userData中存储更大量的数据,而在较新的浏览器上,您可以使用DOM Storage,无论是哪种方式都没有HTTP开销。但依赖于这些并不是很好的兼容性。你真的需要在客户端存储那么多吗?对于通用Web应用程序,这可能表明您正在做错了。
还有其他方法可以进行更可靠的Cookie检查吗?
不,这就是它。请注意,您可能无法设置cookie-with-expires-date但成功设置会话cookie(没有过期日期;在浏览器关闭时过期)。这是因为在IE中,当您阻止持久性cookie时,它们会被完全阻止,而不是像其他浏览器那样降级为会话cookie。因此,出于某些目的,您需要进行两次检查。