CookIE是服務器發送給客戶端浏覽器的體積較小的純文本信息,以後當用戶訪問同一個Web服務器時,浏覽器會把它們發送給服務器。通過讓服務器讀取原先保存在客戶端的信息,為浏覽者提供一系列的方便。例如在線交易過程中標識用戶身份,在安全要求不高的場合可避免用戶重復輸入名字和密碼、門戶網站的主頁定制、有針對性地投放廣告等。
使用Cookie可以為用戶帶來方便,但在安全性要求較高的場合下,建議不要使用CookIE。此外,浏覽器中只允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie的大小限制為4 kB,故不必擔心CookIE會過多地占用硬盤的空間。
Cookie存放在客戶端,首先要新建一個Cookie,然後設置其屬性,再通過response對象的addCookie()方法將其放入客戶端,獲取Cookie對象可調用request對象的getcookIEs()方法。
1.創建CookIE
調用Cookie對象的構造函數可以創建CookIE,構造函數的語法格式如下:
Cookie(String cookiename,String cookIEvalue)
在函數中,第一個參數cookiename是新建的Cookie對象的名稱,第二個參數cookievalue是新建的CookIE對象的值。
CookIE對象的名稱和值都不能包含空白字符以及下列字符:
[ ] ( ) = , " / ? @ :
2.設置與讀取CookIE屬性
在把Cookie加入待發送的應答頭之前,可以查看或設置CookIE的各種屬性。
getComment()/setComment():獲取/設置CookIE的注釋。
getDomain()/setDomain():獲取/設置CookIE適用的域。
使用這兩個方法可以指示浏覽器把Cookie返回給同一域內的其他服務器。注意域必須以點開始(例如.sitename.com),非國家類的域(如.com,.edu,.gov)必須包含兩個點,國家類的域(如.com.cn,.edu.uk)必須包含三個點,一般地,CookIE只返回給與發送它的服務器名稱完全相同的服務器。
getMaxAge()/setMaxAge():獲取/設置Cookie過期之前的時間,以秒計。如果不設置該值,則CookIE只在當前會話內有效,即在用戶關閉浏覽器之前有效,而且這些CookIE不會保存到磁盤上。
getName()/setName():獲取/設置Cookie的名稱。本質上,名稱和值是需要程序員始終關心的兩個部分。由於HttpServletRequest的getCookies方法返回的是一個CookIE對象的數組,因此通常要用循環語句來訪問這個數組並查找特定名稱,然後用getValue()檢查它的值。
getPath()/setPath():獲取/設置Cookie適用的路徑。如果不指定路徑,Cookie將返回給當前頁面所在目錄及其子目錄下的所有頁面。這裡的方法可以用來設定一些條件。例如,someCookIE.setPath("/"),此時服務器上的所有頁面都可以接收到該CookIE。
getSecure()/setSecure():獲取/設置一個boolean值,該值表示CookIE是否只能通過加密的連接(即SSL)發送。
getValue()/setValue():獲取/設置CookIE的值。如前所述,名稱和值實際上是程序員始終關心的兩個方面。不過也有一些例外情況,比如把名稱作為邏輯標記(也就是說,如果該名稱存在,則表示true)。
getVersion()/setVersion():獲取/設置CookIE所遵從的協議版本。默認版本0(遵從原先的Netscape規范);版本1遵從RFC 2109,但尚未得到廣泛的支持。
3.將CookIE加入HTTP頭中
可將addCookie()方法加入到Set-CookIE應答頭。如下所示:
Cookie usernameCookie = new CookIE("username", "dzycsai");
response.addCookie(userCookIE);
4.讀取CookIE
從客戶端讀取Cookie時調用的是request對象的getCookies()方法。該方法返回一個與HTTP請求頭中的內容對應的Cookie對象數組。得到這個數組之後,一般是用循環語句訪問其中的各個元素,並調用getName()檢查各個Cookie的名字,直至找到目標Cookie為止;然後對這個目標CookIE調用getValue(),根據獲得的結果進行其他處理。
5.CookIE工具函數
用request對象的getCookies()方法得到一個Cookie對象的數組,要找到指定的Cookie對象比較麻煩,這時可以編寫一個得到指定名稱的CookIE對象值的方法,這裡,提供一個這樣的函數。
String getCookieValue(Cookie[] cookIEArray,
String cookIEName,String defaultValue) {
for(int i=0; i<cookIEs.length;i ={
Cookie cookie = cookIEs[i];
if (cookieName.equals(cookIE.getName()))
return(cookIE.getValue());
}
return(defaultValue);
}
在此方法中,第一個參數是一個Cookies數組,可以用request.getCookies()方法得到;第二個參數cookieName,查找的Cookie對象的名稱;第三個參數defaultValue是在沒有找到指定的CookIE對象時返回的值。
《JSP網絡編程從實踐到實踐》原碼下載地址:http://shop.csai.cn/itbook/itbookinfo.ASP?lbbh=10051575