首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

8.5  突破浏览器对cookie数目的限制

cookie被设计来存储网站的一些小数据,而并不是用来做大量数据存储之用。因此,对于cookie的存储能力,也有一些限制。

 方 法

对一个特定的站点而言,cookie中的字符串长度被限制为4K,即4096个字符。在实际应用中,这通常不会成为障碍,因为对于多数应用,4K的长度已经非常充足了。但是,对于cookie的另一个限制则是要求每个域或者服务器的cookie数目不超过20个。这个限制将会对一些站点造成影响,当不得不超过这个限制的时候,有个方法能够帮助解决这个难题,即使用子cookie。

子cookie方法是设法在一个单独的cookie中存储一组值。所以,对于document.cookie来说,现在需要分解三次才能得到想要的值。子cookie的语法完全由用户定制,不过应当使之标准化,并且避免在名字和值中使用自己定义的分隔符。通常是使用冒号(:)作为名字和值的分隔符,而用斜线(/)作为子cookie之间的分隔符。document.cookie的字符串如下:

monsterCookie=fur:blue/food:biscuits/name:Cookie_Monster

如果使用冒号作为名字和值的分隔符,有可能需要对cookie的值进行转义,以确保不会和语法冲突:

File: circumvent_browser_restrictions.js (excerpt)

var cookieName = "monsterCookie";

var cookieValue = "fur:blue/food:biscuits/name:Cookie_Monster";

cookieValue = escape(cookieValue);

var theCookie = cookieName + "=" + cookieValue;

document.cookie = theCookie;

cookie值被转义之后,document.cookie如下所示:

monsterCookie=fur%3Ablue/food%3Abiscuits/name%3ACookie_Monster

当重新读入cookie,并且寻找其中的子cookie值时,需要先转义cookie值,然后再解析,以访问其中的子cookie。如果把所有的解析操作放到一起,就得到了一个函数:

File: circumvent_browser_restrictions.js (excerpt)

function getSubCookie(cookieName, subCookieName)

{

  var cookies = document.cookie.split(";");

  for (var i = 0; i < cookies.length; i++)

  {

    var cookieCrumbs = cookies[i].split("=");

    cookieCrumbs[0] = cookieCrumbs[0].replace(/^\s+/, "");

    if (cookieCrumbs[0] == cookieName)

    {

      var cookieValue = cookieCrumbs[1];

      cookieValue = unescape(cookieValue);

      var subCookies = cookieValue.split("/");

      for (var j = 0; j < subCookies.length; j++)

      {

        var subCookieCrumbs = subCookies[j].split(":");

        if (subCookieCrumbs[0] == subCookieName)

        {

          return subCookieCrumbs[1];

        }

      }

    }

  }

  return false;

}

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论