什么是Cookie(轉(zhuǎn))
Cookie是在Web上用于存儲(chǔ)客戶(hù)系統(tǒng)信息的對(duì)象。所有的信息都以每行一個(gè)Cookie的形式存放在客戶(hù)端的一個(gè)名為cookies.txt的文件里。Cookie在HTTP頭標(biāo)(客戶(hù)和服務(wù)器用來(lái)標(biāo)識(shí)自身的分組)中在客戶(hù)機(jī)與服務(wù)器之間傳輸。
Cookie由某個(gè)WWW網(wǎng)頁(yè)在某客戶(hù)機(jī)上進(jìn)行設(shè)置。比如,某個(gè)WWW網(wǎng)頁(yè)已在一個(gè)用戶(hù)的計(jì)算機(jī)上設(shè)置了一個(gè)Cookie,其中存儲(chǔ)的信息是該用戶(hù)的身份號(hào)(隨機(jī)賦予該用戶(hù)的唯一標(biāo)識(shí)),當(dāng)該用戶(hù)的瀏覽器連接該WWW站點(diǎn)時(shí),站點(diǎn)要求瀏覽器將Cookie送回,他的身份號(hào)就通過(guò)Cookie 傳遞給該網(wǎng)頁(yè)所在的WWW服務(wù)器。服務(wù)器上的一個(gè)CGI程序查找一個(gè)服務(wù)器端的文件以確定關(guān)于他的預(yù)設(shè)內(nèi)容。
當(dāng)某個(gè)服務(wù)器在客戶(hù)的計(jì)算機(jī)上設(shè)置Cookie后,請(qǐng)注意如果要讓Cookie信息確實(shí)寫(xiě)入文件,必須關(guān)閉瀏覽器。在瀏覽器未關(guān)閉之前,任何新的或變化的Cookie都存放在內(nèi)存中。
二、Cookie的特性
每個(gè)Cookie包含有6個(gè)元素,常用的有:name、value、expires、domain和secure。這些元素存放了這個(gè)Cookie的作用范圍及實(shí)際的數(shù)據(jù)。
1.name 這是每一個(gè)Cookie必須有的元素,它是該Cookie的名字。name元素是一個(gè)不含分號(hào)、逗號(hào)和空格的字符串。其命名方式與變量命名相同。
2.value value也是每個(gè)Cookie必須有的元素,它是該Cookie的值。value元素是實(shí)際存放于Cookie中的信息。它是由任何字符構(gòu)成的字符串。
3.expires expires是一個(gè)Cookie的過(guò)期時(shí)間。沒(méi)有設(shè)置expires元素的Cookie在用戶(hù)斷開(kāi)連接后過(guò)期,但在用戶(hù)關(guān)閉瀏覽器之前Cookie依然存在。
Cookie有一個(gè)過(guò)期時(shí)間并等于它會(huì)從Cookie.txt文件中被刪除。在它的位置被用來(lái)存放另一個(gè)Cookie前,它依然存在著。過(guò)期的Cookie只是不被送往要求使用它的服務(wù)器。
expire是一個(gè)串,它的形式如下:
Wdy, DD-Mon-YY HH:MM:SS GMT
expires元素是可選的。
4.domain domain是設(shè)置某個(gè)Cookie的Web網(wǎng)頁(yè)所在的計(jì)算機(jī)的域名。這樣,由一個(gè)站點(diǎn)創(chuàng)建的Cookie不會(huì)影響到另一個(gè)站點(diǎn)上的程序。對(duì)于較高層的域名如.com, .edu,或.mil,域名中至少有兩個(gè)分隔符(.)。而對(duì)于較低層的域名如.cn, .uk或.ca,域名中至少有3個(gè)分隔符。demain元素自動(dòng)地被設(shè)為網(wǎng)頁(yè)所在站點(diǎn)的基本域名。比如,你的網(wǎng)頁(yè)位于http://www.abc.com/~user,則該網(wǎng)頁(yè)創(chuàng)建的Cookie缺省地對(duì)域abc.com有效。如果你希望你的Cookie 只應(yīng)用于服務(wù)器www3.abc.com,那么你必須在設(shè)置Cookie的時(shí)候指定。
只有擁有域名的站點(diǎn)才能為那個(gè)域名設(shè)置Cookie
5.path 一個(gè)Cookie可以被指定為只針對(duì)一個(gè)站點(diǎn)的某一層次。如果一個(gè)Web站點(diǎn)要區(qū)分已注冊(cè)的和未注冊(cè)的客戶(hù),就可以為已經(jīng)注冊(cè)的客戶(hù)設(shè)置Cookie,當(dāng)注冊(cè)過(guò)的客戶(hù)訪問(wèn)該站點(diǎn)時(shí),他就可以訪問(wèn)到只對(duì)注冊(cè)客戶(hù)有效的頁(yè)面。path是可選項(xiàng),如果沒(méi)有指定path,將被缺省地設(shè)置為設(shè)置Cookie的頁(yè)面的路徑。
6.secure標(biāo)志 secure是一個(gè)布爾值(真或假)。它的缺省值為假。如果它被設(shè)為真值, 這個(gè)Cookie只被瀏覽器認(rèn)為是安全的服務(wù)器所記住。
三、關(guān)于Cookie的一些限制
一個(gè)站點(diǎn)能為一個(gè)單獨(dú)的客戶(hù)最多設(shè)置20個(gè)Cookie。如果一個(gè)站點(diǎn)有兩個(gè)服務(wù)器(如www.abc.com和www3.abc.com)但沒(méi)有指定域名,Cookie的域名缺省地是abc.com。如果指定了確切的服務(wù)器地址,則每個(gè)站點(diǎn)可以設(shè)置20個(gè)Cookie--而不是總共20個(gè)。不僅每個(gè)服務(wù)器能設(shè)置的Cookie數(shù)目是有限的,而且每個(gè)客戶(hù)機(jī)最多只能存儲(chǔ)300個(gè)Cookie。如果一個(gè)客戶(hù)機(jī)已有300個(gè)Cookie,并且一個(gè)站點(diǎn)在它上面又設(shè)置了一個(gè)新Cookie,那么,先前存在的某一個(gè)Cookie將被刪除。
每個(gè)Cookie也有自身的限制。Cookie不得超過(guò)4KB(4096bytes),其中包括名字和其他信息。
四、javascript和Cookie
現(xiàn)在大家已經(jīng)了解有關(guān)Cookie的一些基本概念了,讓我們更進(jìn)一步討論Cookie。可以用javascript來(lái)很方便地編寫(xiě)函數(shù)用來(lái)創(chuàng)建、讀取和刪除Cookie。下面,我們就介紹這些函數(shù)
1.創(chuàng)建Cookie
我們要進(jìn)行的第一件事就是要?jiǎng)?chuàng)建一個(gè)Cookie。下面給出的SctCookie()函數(shù)將完成這一功能。
function SetCookit (name, value) {
var argv=SetCookie.arguments;
var argc=SetCookie.arguments.length;
var expires=(argc>2)?argv[2]: null;
var path=(argc>3)? argv[3]: null;
var domain=(argc>4)? argv[4]: null;
var secure=(argc>5)? argv[5]: false;
documents.cookie=name+"="+escape
(value)+
((expires==null)?"":(";expires="
+expires.toGMTString()))+
((path==null)?"":(";path="+path))+
((domain==null)?"":(";domain="+
domain))+
((secure==true)?";secure":"");
}
SetCookie()只要求傳遞被設(shè)置的Cookie的名字和值,但如果必要的話你可以設(shè)置其他4 個(gè)參數(shù)而不必改變這個(gè)函數(shù)。可選的參數(shù)必須用正確的次序使用。如果不想設(shè)置某個(gè)參數(shù), 必須設(shè)置一個(gè)空串。比如,如果我們創(chuàng)建的一個(gè)Cookie需要指定secure域,但不想設(shè)置expires, patb或domain,就可以像這樣調(diào)用SetCokie(): SetCookie("MyNewCookie","Myvalue" ,"",","tyue);
2.讀取Cookie
下面給出的函數(shù)GetCookie()用來(lái)讀取一個(gè)Cookie。當(dāng)一個(gè)Cookie的請(qǐng)求被客戶(hù)機(jī)收到時(shí),該客戶(hù)機(jī)查找它的cookies.txt文件以進(jìn)行匹配。這個(gè)函數(shù)首先匹配這個(gè)Cookie的名字。如果有多個(gè)同名的Cookie,它再匹配路徑。函數(shù)完成匹配后返回這個(gè)Cookie的值。如果客戶(hù)機(jī)中沒(méi)有這個(gè)Cookie,或者路徑不匹配,該函數(shù)返回一個(gè)NULL。
function GetCookie(name) {
var arg=name+ "=";
var alen=arg.length;
var clen=documents.cookie.length;
var i=0;
while (i<clen) {
var j=i+alen;
if(documents.cookie.substring(i,j)
==arg)
return getCookieVal(j);
i=documents.cookie.indexOf("",i)+1;
if(i==0)break;
}
return null;
}
函數(shù)中使用了getCookieVal()函數(shù),它是GetCookie()函數(shù)的補(bǔ)充。getCookieVal()將C ookies.txt文件分解為片斷,并從一批Cookie中讀出正確的Cookie。該函數(shù)的實(shí)現(xiàn)如下:
function getCookieVal(offset) {
var endstr=documents.cookie.indexOf
(";",offset);
if(endstr==-1) //沒(méi)有指定其他元素
endstr=documents.cookie.length;
return unescape(documents.cookie.substring
(offset,endstr));
}
3.刪除Cookie
刪除一個(gè)Cookie很簡(jiǎn)單,只需將它的過(guò)期時(shí)間設(shè)為NULL。當(dāng)用戶(hù)斷開(kāi)連接后,這個(gè)Cooki e就過(guò)期了(沒(méi)有過(guò)期時(shí)間的Cookie將在瀏覽器關(guān)閉時(shí)被刪除)。下面的函數(shù)DeleteCookie() 說(shuō)明了如何刪除一個(gè)
Cookie:
function DeleteCookie(name) {
var exp=new Date();
exp.setTime(exp.getTime()-1);
//將exp設(shè)為已過(guò)期的時(shí)間
var cval=GetCookie(name);
documents.cookie=name+"="+cval+";
expires="+exp.toGMTString();
}
Cookie由某個(gè)WWW網(wǎng)頁(yè)在某客戶(hù)機(jī)上進(jìn)行設(shè)置。比如,某個(gè)WWW網(wǎng)頁(yè)已在一個(gè)用戶(hù)的計(jì)算機(jī)上設(shè)置了一個(gè)Cookie,其中存儲(chǔ)的信息是該用戶(hù)的身份號(hào)(隨機(jī)賦予該用戶(hù)的唯一標(biāo)識(shí)),當(dāng)該用戶(hù)的瀏覽器連接該WWW站點(diǎn)時(shí),站點(diǎn)要求瀏覽器將Cookie送回,他的身份號(hào)就通過(guò)Cookie 傳遞給該網(wǎng)頁(yè)所在的WWW服務(wù)器。服務(wù)器上的一個(gè)CGI程序查找一個(gè)服務(wù)器端的文件以確定關(guān)于他的預(yù)設(shè)內(nèi)容。
當(dāng)某個(gè)服務(wù)器在客戶(hù)的計(jì)算機(jī)上設(shè)置Cookie后,請(qǐng)注意如果要讓Cookie信息確實(shí)寫(xiě)入文件,必須關(guān)閉瀏覽器。在瀏覽器未關(guān)閉之前,任何新的或變化的Cookie都存放在內(nèi)存中。
二、Cookie的特性
每個(gè)Cookie包含有6個(gè)元素,常用的有:name、value、expires、domain和secure。這些元素存放了這個(gè)Cookie的作用范圍及實(shí)際的數(shù)據(jù)。
1.name 這是每一個(gè)Cookie必須有的元素,它是該Cookie的名字。name元素是一個(gè)不含分號(hào)、逗號(hào)和空格的字符串。其命名方式與變量命名相同。
2.value value也是每個(gè)Cookie必須有的元素,它是該Cookie的值。value元素是實(shí)際存放于Cookie中的信息。它是由任何字符構(gòu)成的字符串。
3.expires expires是一個(gè)Cookie的過(guò)期時(shí)間。沒(méi)有設(shè)置expires元素的Cookie在用戶(hù)斷開(kāi)連接后過(guò)期,但在用戶(hù)關(guān)閉瀏覽器之前Cookie依然存在。
Cookie有一個(gè)過(guò)期時(shí)間并等于它會(huì)從Cookie.txt文件中被刪除。在它的位置被用來(lái)存放另一個(gè)Cookie前,它依然存在著。過(guò)期的Cookie只是不被送往要求使用它的服務(wù)器。
expire是一個(gè)串,它的形式如下:
Wdy, DD-Mon-YY HH:MM:SS GMT
expires元素是可選的。
4.domain domain是設(shè)置某個(gè)Cookie的Web網(wǎng)頁(yè)所在的計(jì)算機(jī)的域名。這樣,由一個(gè)站點(diǎn)創(chuàng)建的Cookie不會(huì)影響到另一個(gè)站點(diǎn)上的程序。對(duì)于較高層的域名如.com, .edu,或.mil,域名中至少有兩個(gè)分隔符(.)。而對(duì)于較低層的域名如.cn, .uk或.ca,域名中至少有3個(gè)分隔符。demain元素自動(dòng)地被設(shè)為網(wǎng)頁(yè)所在站點(diǎn)的基本域名。比如,你的網(wǎng)頁(yè)位于http://www.abc.com/~user,則該網(wǎng)頁(yè)創(chuàng)建的Cookie缺省地對(duì)域abc.com有效。如果你希望你的Cookie 只應(yīng)用于服務(wù)器www3.abc.com,那么你必須在設(shè)置Cookie的時(shí)候指定。
只有擁有域名的站點(diǎn)才能為那個(gè)域名設(shè)置Cookie
5.path 一個(gè)Cookie可以被指定為只針對(duì)一個(gè)站點(diǎn)的某一層次。如果一個(gè)Web站點(diǎn)要區(qū)分已注冊(cè)的和未注冊(cè)的客戶(hù),就可以為已經(jīng)注冊(cè)的客戶(hù)設(shè)置Cookie,當(dāng)注冊(cè)過(guò)的客戶(hù)訪問(wèn)該站點(diǎn)時(shí),他就可以訪問(wèn)到只對(duì)注冊(cè)客戶(hù)有效的頁(yè)面。path是可選項(xiàng),如果沒(méi)有指定path,將被缺省地設(shè)置為設(shè)置Cookie的頁(yè)面的路徑。
6.secure標(biāo)志 secure是一個(gè)布爾值(真或假)。它的缺省值為假。如果它被設(shè)為真值, 這個(gè)Cookie只被瀏覽器認(rèn)為是安全的服務(wù)器所記住。
三、關(guān)于Cookie的一些限制
一個(gè)站點(diǎn)能為一個(gè)單獨(dú)的客戶(hù)最多設(shè)置20個(gè)Cookie。如果一個(gè)站點(diǎn)有兩個(gè)服務(wù)器(如www.abc.com和www3.abc.com)但沒(méi)有指定域名,Cookie的域名缺省地是abc.com。如果指定了確切的服務(wù)器地址,則每個(gè)站點(diǎn)可以設(shè)置20個(gè)Cookie--而不是總共20個(gè)。不僅每個(gè)服務(wù)器能設(shè)置的Cookie數(shù)目是有限的,而且每個(gè)客戶(hù)機(jī)最多只能存儲(chǔ)300個(gè)Cookie。如果一個(gè)客戶(hù)機(jī)已有300個(gè)Cookie,并且一個(gè)站點(diǎn)在它上面又設(shè)置了一個(gè)新Cookie,那么,先前存在的某一個(gè)Cookie將被刪除。
每個(gè)Cookie也有自身的限制。Cookie不得超過(guò)4KB(4096bytes),其中包括名字和其他信息。
四、javascript和Cookie
現(xiàn)在大家已經(jīng)了解有關(guān)Cookie的一些基本概念了,讓我們更進(jìn)一步討論Cookie。可以用javascript來(lái)很方便地編寫(xiě)函數(shù)用來(lái)創(chuàng)建、讀取和刪除Cookie。下面,我們就介紹這些函數(shù)
1.創(chuàng)建Cookie
我們要進(jìn)行的第一件事就是要?jiǎng)?chuàng)建一個(gè)Cookie。下面給出的SctCookie()函數(shù)將完成這一功能。
function SetCookit (name, value) {
var argv=SetCookie.arguments;
var argc=SetCookie.arguments.length;
var expires=(argc>2)?argv[2]: null;
var path=(argc>3)? argv[3]: null;
var domain=(argc>4)? argv[4]: null;
var secure=(argc>5)? argv[5]: false;
documents.cookie=name+"="+escape
(value)+
((expires==null)?"":(";expires="
+expires.toGMTString()))+
((path==null)?"":(";path="+path))+
((domain==null)?"":(";domain="+
domain))+
((secure==true)?";secure":"");
}
SetCookie()只要求傳遞被設(shè)置的Cookie的名字和值,但如果必要的話你可以設(shè)置其他4 個(gè)參數(shù)而不必改變這個(gè)函數(shù)。可選的參數(shù)必須用正確的次序使用。如果不想設(shè)置某個(gè)參數(shù), 必須設(shè)置一個(gè)空串。比如,如果我們創(chuàng)建的一個(gè)Cookie需要指定secure域,但不想設(shè)置expires, patb或domain,就可以像這樣調(diào)用SetCokie(): SetCookie("MyNewCookie","Myvalue" ,"",","tyue);
2.讀取Cookie
下面給出的函數(shù)GetCookie()用來(lái)讀取一個(gè)Cookie。當(dāng)一個(gè)Cookie的請(qǐng)求被客戶(hù)機(jī)收到時(shí),該客戶(hù)機(jī)查找它的cookies.txt文件以進(jìn)行匹配。這個(gè)函數(shù)首先匹配這個(gè)Cookie的名字。如果有多個(gè)同名的Cookie,它再匹配路徑。函數(shù)完成匹配后返回這個(gè)Cookie的值。如果客戶(hù)機(jī)中沒(méi)有這個(gè)Cookie,或者路徑不匹配,該函數(shù)返回一個(gè)NULL。
function GetCookie(name) {
var arg=name+ "=";
var alen=arg.length;
var clen=documents.cookie.length;
var i=0;
while (i<clen) {
var j=i+alen;
if(documents.cookie.substring(i,j)
==arg)
return getCookieVal(j);
i=documents.cookie.indexOf("",i)+1;
if(i==0)break;
}
return null;
}
函數(shù)中使用了getCookieVal()函數(shù),它是GetCookie()函數(shù)的補(bǔ)充。getCookieVal()將C ookies.txt文件分解為片斷,并從一批Cookie中讀出正確的Cookie。該函數(shù)的實(shí)現(xiàn)如下:
function getCookieVal(offset) {
var endstr=documents.cookie.indexOf
(";",offset);
if(endstr==-1) //沒(méi)有指定其他元素
endstr=documents.cookie.length;
return unescape(documents.cookie.substring
(offset,endstr));
}
3.刪除Cookie
刪除一個(gè)Cookie很簡(jiǎn)單,只需將它的過(guò)期時(shí)間設(shè)為NULL。當(dāng)用戶(hù)斷開(kāi)連接后,這個(gè)Cooki e就過(guò)期了(沒(méi)有過(guò)期時(shí)間的Cookie將在瀏覽器關(guān)閉時(shí)被刪除)。下面的函數(shù)DeleteCookie() 說(shuō)明了如何刪除一個(gè)
Cookie:
function DeleteCookie(name) {
var exp=new Date();
exp.setTime(exp.getTime()-1);
//將exp設(shè)為已過(guò)期的時(shí)間
var cval=GetCookie(name);
documents.cookie=name+"="+cval+";
expires="+exp.toGMTString();
}
posted on 2009-11-03 16:28 胡鵬 閱讀(328) 評(píng)論(0) 編輯 收藏 所屬分類(lèi): js,html,css