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。