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;
}







