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