[原创]在InternetExplorer中对Cookie数目的多少和cookie字节数的大小限制的处理(翻译自微软英文文档)

jackxiang 2008-5-27 16:23 | |
背景:有哥们在一PHP群里发现另一个哥们设置cookie的代码编写有点意思,如下:
[codes=php]
$cookieJson = json_encode($cookieArr);
$_COOKIE['userInfo'.$this->roteId] = $cookieJson;
setcookie('userInfo'.$this->roteId,$cookieJson );
[/codes]

为何会超cookie呢,cookie和session一样也有大小限定的,浏览器不一样的大小,于浏览器相关,但大小是必须有限定的,还和网站有多少个cookie的限定,如下:
服务器session才会超。cookie是放浏览器里的。
大多数 浏览器都是4K的,4096字节的COOKIE.
目测COOKIE数量也只有20个吧 最多一个站点的COOKIE数量。


尽管有微软的机器翻译(http://support.microsoft.com/kb/306070),但是总觉得好像不太通达,难以让人理解!
E文地址:http://support.microsoft.com/?scid=kb%3Ben-us%3B306070&x=17&y=10
我翻译如下:
在InternetExplorer中对Cookie数目的多少和cookie字节数的大小限制的处理
概述:
Microsoft Internet Explorer 符合 RFC 2109推荐的最低限制标准如下:
最多 300个 Cookie
每个Cookie 最多4096 字节(如通过字符大小来计算没有限定对Set-Cookie头的大小进行描述)  
每个唯一主机或域名称最多支持20个Cookie
注意: 这些要求最低限制符合 RFC 2109中, 节 6.3, " 实现限制 "。 有关详细信息, 请参阅 " 参考 " 部分。

名称 - 每个Cookie对应一个名称--数值来配对, 这种名称和数值的陪对中间可由零或更多的属性由分号来分隔。 对于一个域名,每个Cookie 仅限于4,096 字节。 这个总数可存在作为一个名称 - 值对的 4(KB) 或作为最多 20 名称和数值配对总其不大于4KB。如果计算机没有足够空间来存储 Cookie, 会丢弃Cookie,同时将不能恢复。 因此使用Cookie的应用程序使用尽可能用少用Cookie 尽可能把所有的cookie的值写得尽可能的短小。否则, 应用程序不能读取到丢失了由于超过4Kb的cookie数值。
如果一个Web 应用程序使用多达19个自定义的Cookie, ASP会话状态就很有可能丢失。 因为Internet Explorer 4.0 和更版本对于每个域允许总共才20 Cookie。是由于浏览器对如果使用 20个或更多的自定义Cookie时,浏览器将强制删除ASP前面的会话Cookie 从面导致会话丢失。

要想存对于一个域存取多于20 多个cookie的名称和数值,你最好创建一个cookie字典(个人理解:相当于通过数组来达到增加cookie数目)通过级联各个名字对各个cookie但同时最好最高不能超出4096 字节的限制.目前做法是用来检索这些值来自客户端脚本, 您必须手动分析 Cookie值。然而,ASP请求和 响应对象包括内置功能使用 Cookie 词典作为词对象。
下列代码例子演示使用 ASP 页中 Cookie 词典:
<%
   Response.Cookies ("MyCookie")("a")="A"
   Response.Cookies ("MyCookie")("b")="B"  
   Response.Cookies ("MyCookie")("c")="C"
   Response.Cookies ("MyCookie")("d")="D"
   Response.Cookies ("MyCookie")("e")="E"
   Response.Cookies ("MyCookie")("f")="F"
   Response.Cookies ("MyCookie")("g")="G"
   Response.Cookies ("MyCookie")("h")="H"
   Response.Cookies ("MyCookie")("i")="I"
   Response.Cookies ("MyCookie")("j")="J"
   Response.Cookies ("MyCookie")("k")="K"
   Response.Cookies ("MyCookie")("l")="L"
   Response.Cookies ("MyCookie")("a1")="A"
   Response.Cookies ("MyCookie")("b1")="B"  
   Response.Cookies ("MyCookie")("c1")="C"
   Response.Cookies ("MyCookie")("d1")="D"
   Response.Cookies ("MyCookie")("e1")="E"
   Response.Cookies ("MyCookie")("f1")="F"
   Response.Cookies ("MyCookie")("g1")="G"
   Response.Cookies ("MyCookie")("h1")="H"
   Response.Cookies ("MyCookie")("i1")="I"
   Response.Cookies ("MyCookie")("j1")="J"
   Response.Cookies ("MyCookie")("k1")="K"
   Response.Cookies ("MyCookie")("l1")="L"  
   Response.Cookies("MyCookie").Expires = "12/31/2001"
   For Each strKey In Request.Cookies
      Response.Write strKey & " = " & Request.Cookies(strKey) & "<BR><BR>"
      If Request.Cookies(strKey).HasKeys Then
        For Each strSubKey In Request.Cookies(strKey)
          Response.Write "->" & strKey & "(" & strSubKey & ") = " & _
            Request.Cookies(strKey)(strSubKey) & "<BR>"
        Next
      End If
    Next
%>
注意:
对于Internet Explorer 5.0 和更高版本, 可用于 userData 行为跨会话保持数据通过seesions。这样做相比于Cookie的大小来说就会有更大容量来存取会话。

如果使用 document.cookie属性在客户端可检索该 Cookie值, document.cookie 属性可检索只有4,096字节大小。 这个字节总数是 4KB, 这些字节总大小为 4KB的cooke是一个名称对应一个值最多可以有20个名称和值一一对应!

在 Microsoft HTML document.getcookie 函数调用 CDocument::GetCookie 方法。

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/1049/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2014-12-23 16:56
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]