Cookie的構成
1、名稱:
一個唯一確定cookie的名稱。
2、值:
儲存在cookie中的字符串值。值必須被URL編碼。
3、域:
cookie對於哪個域是有效的。所有向該域發送的請求中都會包含這個cookie信息。這個值可以包含子域(sudomain,如www.wrox.com),也可以不包含它(如.wrox.com,則對於wrox.com的所有子域都有效)。如果沒有明確設定,那麼這個域會被認作來自設置cookie的那個域。
4、路徑:
對於指定域中的那個路徑,應該向服務器發送cookie。
5、失效時間:
表示cookie何時應該被刪除的時間戳(也就是,何時應該停止向服務器發送這個cookie)。如果你設置的失效時間是以前的時間,則cookie會被立刻刪除。
6、安全標誌:
指定後,cookie只有在使用SSL連接的時候才發送到服務器。secure標誌是cookie中唯一一個非名值對兒的部分,直接包含一個secure單詞。
由於JavaScript中讀寫cookie不是非常直觀,常常需要寫一些函數來簡化cookie的功能。基本的cookie操作有三種:讀取、寫入和刪除。它們在CookieUtil對象中如下表示。有get()方法、set()方法和unset()方法。
var CookieUtil={
get:function(name){
var cookieName=encodeURIComponent(name)+"=",
cookieStart=document.cookie.indexOf(cookieName),
cookieValue=null;
if(cookieStart>-1){
var cookieEnd=document.cookie.indexOf(";",cookieStart);
if(cookieEnd == -1){
cookieEnd = document.cookie.length;
}
cookieValue=decodeURIComponent(document.cookie.substring(cookieStart + cookieName.length,cookieEnd));
}
return cookieValue;
},
set:function(name,value,expires,path,domain,secure){
var cookieText=encodeURIComponent(name) + "=" + encodeURIComponent(value);
if(expires instanceof Date){
cookieText += "; expires=" +expires.toGMTString();
}
if(path){
cookieText += "; path=" + path;
}
if(domain){
cookieText += "; domain" +domain;
}
if(secure){
cookieText += "; secure";
}
document.cookie=cookieText;
},
unset:function(name, path ,domain, secure){
this.set(name, "", new Date(0), path, domain, secure);
}
};
可以像下面這樣使用上述方法。
//設置cookie
CookieUtil.set("name","Nicholas");
CookieUtil.set("book","Professional JavaScript");
//讀取cookie的值
alert(CookieUtil.get("name")); //"Nicholas"
alert(CookieUtil.get("book")); //"Professional JavaScript"
//刪除cookie
CookieUtil.unset("name");
CookieUtil.unset("book");
//設置cookie,包括它的路徑、域、失效日期
CookieUtil.unset("name","Nicholas","/book/projs/","www.wrox.com",new Date("January 1,2010"));
//刪除剛剛設置的cookie
CookieUtil.unset("name","/books/projs","www.wrox.com");
//設置安全的cookie
CookieUtil.set("name","Nicholas",null,null,null,true);
子cookie
爲了繞開瀏覽器的單域名下的cookie數限制,一些開發人員使用了一種稱爲子cookie(subcookie)的概念。子cookie是存放在單個cookie中的更小段的數據。也就是使用cookie值來存儲多個名稱值對兒。子cookie最常見的格式如下所示:
name=name1=value1&name2=value2&name3=value3&name4=value4&name5=value5
子cookie的方法有get()、getAll()、set()、setAll()、unset()、unsetAll()。
由於代碼太長,分成三部分寫:
1、get()、getAll()
var SubCookieUtil={
get : function(name, subName){
var subCookies=this.getAll(name);
if(subCookies){
return subCookies[subName];
}else{
return null;
}
},
getAll :function(name){
var cookieName=encodeURIComponent(name) + "=",
cookieStart=document.cookie.indexOf(cookieName),
cookieValue=null,
cookieEnd,
subCookies,
i,
parts,
result={};
if(cookieStart > -1){
cookieEnd=document.cookie.indexOf(";",cookieStart);
if(cookieEnd == -1){
cookieEnd = document.cookie.length;
}
cookieValue=document.cookie.substring(cookieStart + cookieName.length, cookieEnd);
if(cookieValue.length > 0){
subCookies = cookieValue.split("&");
for(var i=0,len=subCookie.length;i<len; i++){
parts=subCookie[i].split("=");
result[decodeURIComponent(parts[0])]=decodeURIComponent(parts[1]);
}
return result;
}
}
return null;
},
//省略了更多代碼
};
可以像下面這樣使用上述方法:
//假設document.cookie=data=name=Nicholas&book=Professional%20JavaScript
//取得全部子cookie
var data=SubCookieUtil.getAll("data");
alert(data.name); //"Nicholas"
alert(data.book); //"Professional JavaScript"
//逐個獲取子Cookie
alert(SubCookieUtil.get("data","name")); //"Nicholas"
alert(SubCookieUtil.get("data","book")); //"Professional JavaScript"
2、要設置子cookie,也有兩種方法:set()和setAll()。以下代碼展示了它們的構造:
var SubCookieUtil={
set:function(name,subName,value,expires,path,domain,secure){
var subcookies=this.getAll(name)||{};
subcookies[subName]=value;
this.setAll(name,subcookies,expires,path,domain,secure);
},
setAll:function(name,subcookies,expires,path,domain,secure){
var cookieText=encodeURIComponent(name)+ "=",
subcookieParts=new Array(),
subName;
for(subName in subcookies){
if(subName.length > 0 && subcookies.hasOwnProperty(subName)){
subcookieParts.push(encodeURIComponent(subName) + "=" + encodeURIComponent(subcookies[subName]));
}
}
if(cookieParts.length > 0){
cookieText += subcookieParts.join("&");
if(expires instanceof Date){
cookieText += "; expires" +expires.toGMTString();
}
if(path){
cookieText += "; path=" +path;
}
if(domain){
cookieText += "; domain=" +domain;
}
if(secure){
cookieText += "; secure"
}
}else{
cookieText += "; expires=" +(new Date(0)).toGMTString();
}
document.cookie=cookieText;
},
//省略了更多代碼
};
可以按如下方式使用這些方法
//假設document.cookie=data=name=Nicholas&book=Professional%20JavaScript
//設置兩個cookie
SubCookieUtil.set("data","name","Nicholas");
SubCookieUtil.set("data","book","Professional JavaScript");
//設置全部子cookie和失效日期
SubCookieUtil.setAll("data",{name:"Nicholas",book:"Professional JavaScript"},new Date("January 1,2010"));
//修改名字的值,並修改cookie的失效日期
SubCookieUtil.set("data","name","Michael",new Date("February 1, 2010"));
3、刪除子cookie的方法unset()和unsetAll()
var SubCookieUtil={
//這裏省略了更多代碼
unset :function (name ,subName ,path ,domain ,secure){
var subcookies=this.getAll(name);
if(subcookies){
delete subcookies[subName];
this.setAll(name,subcookies,null,path,domain,secure);
}
},
unsetAll:function(name,path,domain,secure){
this.setAll(name,null,new Date(0),path,domain,secure);
}
};
使用方法:
//僅刪除名爲name的子cookie
SubCookieUtil.unset("data","name");
//刪除整個cookie
SubCookieUtil.unsetAll("data");