讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議156:靈活使用Cookie存儲長信息 >

建議156:靈活使用Cookie存儲長信息

Cookie適合在客戶端存儲用戶的簡單個人信息,因為Cookie既不是通用的通信機制,也不是通用的數據傳輸機制。從客觀角度分析,Web瀏覽器存儲的Cookie總數不能夠超過300個。如果在同一個域中存儲Cookie信息,那麼Cookie個數不能夠超過20,並且每個Cookie字符串長度不能夠超過4KB,即每個Cookie文本文件的大小不能夠超過4KB,因此使用Cookie存儲信息時一定要適度。Cookie用來存儲需要長期保存的大量數據,一般用來保存用戶的狀態信息和訪問足跡等小數據。

由於每個Web服務器最多只能夠存儲20個Cookie,為了避免超出這個限制,可以把多個用戶信息保存到一個Cookie中,而不是為每個用戶信息新建一個Cookie。由於Cookie可存儲的字符串最大長度為4KB(即4096個字符),在實際應用中,這個字符串長度完全能夠滿足各種用戶信息的存儲。

這裡介紹一種方法,即在Cookie值中存儲一組子名-值對。子名-值對的形式可以自由約定,確保不引發歧義即可。例如,使用冒號作為子名和子值之間的分隔符,而使用逗號作為子名-值對之間的分隔符,這種寫法類似於對像直接量:


subName1:subValue1,subName2:subValue2,subName3:subValue3


然後把這組子名-值串作為值傳遞給Cookie的名稱,例如:


name=subName1:subValue1,subName2:subValue2,subName3:subValue3


為了確保子名-值串不引發歧義,建議使用escape方法對其進行編碼,讀取時再使用unescape方法轉碼即可。下面的示例演示了如何在Cookie中存儲更多的信息:


//定義有效期

var d=new Date;

d.setMonth(d.getMonth+1);

d=d.toGMTString;

//定義Cookie字符串

var a="name:a,age:20,addr:beijing"

var c="user="+escape(a)

c+=";"+"expires="+d;

document.Cookie=c;//寫入Cookie信息


當讀取Cookie信息時,首先要獲取Cookie值,然後調用unescape方法對Cookie值進行解碼,最後再訪問Cookie值中每個子Cookie值。因此,對於document.Cookie來說,需要分解3次才能得到精確的信息。要獲取Cookie的函數如下:


//讀取所有Cookie信息,包括子Cookie信息

//參數:無

//返回值:對象,存儲的是子Cookie信息,其中名稱作為對象的屬性而存在,而值作為屬性值存在

function getSubCookie{

var a=document.Cookie.split(";");

var o={};

for(var i=0;i<a.length;i++){//遍歷Cookie信息數組

a[i]&&(a[i]=a[i].replace(/^\s+|\s+$/,""));

//清除頭部空格符

var b=a[i].split("=");

var c=b[1];

c&&(c=c.replace(/^\s+|\s+$/,""));//清除頭部空格符

c=unescape(c);//解碼Cookie值

if(!/\,/gi.test(c)){

o[b[0]]=b[1];

}

else{

var d=c.split(",");

for(var j=0;j<d.length;j++){//遍歷子Cookie數組

var e=d[j].split(":");

o[e[0]]=e[1];//把子Cookie信息寫入返回對像

}

}

}

return o;//返回包含Cookie信息的對象

}


目前的瀏覽器都支持Cookie,不過也有例外。例如,個別老式瀏覽器不支持Cookie,或者用戶禁止瀏覽器使用Cookie。為了安全起見,在使用Cookie之前,應該探測客戶端是否啟用Cookie,如果沒有啟用,則可以採取應急措施,避免不必要的損失或導致網站部分功能無法實現。

一般可以使用下面的方法來探測客戶端瀏覽器是否支持Cookie。


if(navigator.CookieEnabled){/*如果存在CookieEnabled屬性,則說明瀏覽器支持Cookie,可以安全寫入或讀取Cookie信息*/

setCookie;

//或

getCookie;

}


如果瀏覽器啟用了Cookie,則CookieEnabled屬性值為true;如果瀏覽器禁用了Cookie,則該屬性值為false。