Cookie中的資訊是以索引值對存在的,Cookie檔案是以ASCII編碼儲存的,所以如果想儲存中文資訊,需額外進行編碼後再儲存到Cookie中,讀取時再解碼。
Cookie從伺服器傳送到用戶端時通過在回應標頭資訊中使用:
Java代碼
代碼如下 |
複製代碼 |
Set-Cookie: NAME=VALUE; expires=DATE; path=PATH; domain=DOMAIN_NAME; secure NAME=VALUE |
是Cookie資訊中最關鍵的屬性,name為Cookie的名字,value為對應的值。必需的。
expires
Cookie有效期間。格式為:Wdy, DD-Mon-YYYY HH:MM:SS GMT。當超過這個時間,此cookie將失效。可選屬性,如果未指定到期時間,則在當前會話結束後失效。
path
cookie在當前網域名稱的哪個路徑下可見。如果設定為"/",則在當前網域名稱下的所有路徑均可見;如果設定為"/news",則只能在"http://XXX.com/news"下可見。如果為未設定,則在哪個頁面產生就只能在該頁面訪問。
domain=DOMAIN_NAME
可以訪問該Cookie的網域名稱地址。google.com的cookie只屬於google.com,不能被baidu.com操作。當將網域名稱設定為".google.com",最前面的一個點,表示,google.com下的所有次層網域都和頂層網域共用Cookie。否則,code.google.com網域名稱無法使用google.com下的Cookie,只能使用code.google.com下的Cookie。
secure
指定當前cookie是否使用安全性通訊協定發送cookie(SSL,HTTPS等)。
上面是在回應標頭資訊的設定,如果用戶端需要提交Cookie到伺服器,則格式為:
Cookie: NAME1=OPAQUE_STRING1; NAME2=OPAQUE_STRING2 …
以Cookie打頭,每個索引值對之間分號相隔。
關於Cookie的更多資訊,請訪問NetScape Cookie規範。(目前多數瀏覽器都已支援,其他Cookie規範(比如w3c的)不是所有瀏覽器都支援,所以NetScapeCookie較常見。)
Java中的Cookie
在java中,把Cookie封裝在了javax.servlet.http.Cookie類中。我們所操作的每一個cookie都是該類的對象。
要增加一個cookie時,先聲明一個Cookie對象,就是javax.servlet.http.Cookie類對象,在聲明構造同時可以帶兩個參數(Cookie名,Cookie值),比如:
代碼如下 |
複製代碼 |
Cookie cookie = new Cookie("name","the8m"); |
聲明了一個Cookie對象,Cookie名為name,值為the8m。接著,我們需要將這個Cookie添加到響應response中,發送給用戶端。
response.addCookie(cookie);
這樣一個簡單的Cookie就儲存到用戶端了。
讀取Cookie
當通過response.addCookie(Cookie cookie)給用戶端添加了一個Cookie後,我們可以使用request.getCookie()擷取一個Cookie對象數組,因為有可能一個頁面儲存了多個Cookie。
下面是樣本:
Java代碼
代碼如下 |
複製代碼 |
<% if(request.getCookies()!=null) { for(Cookie coo : request.getCookies()) { String name = coo.getName() String value = coo.getValue() out.println(name+"-- "+value); } } %> |
我們還可以使用EL運算式中的內建隱藏對象cookie讀取,比使用request對象擷取方便很多。
Java代碼
代碼如下 |
複製代碼 |
${cookie}<!-- 顯示所有Cookie對象 --> ${cookie.age.name }<!-- 顯示Cookie名為age的name --> ${cookie.age.value }<!-- 顯示Cookie名為age的值 --> |
Cookie名與Cookie值
名稱必須遵守 RFC 2109。這意味著它只能包含 ASCII 字母數字字元,不能包含逗號、分號或空格,也不能以 $ 字元開頭。cookie 的名稱在建立之後不得更改。
值不能包含空格,方括弧,圓括弧,等號,逗號,雙引號,斜杠,問號,@,冒號,分號。如果值為位元據,需要使用BASE64編碼,比如圖片。
Cookie與中文
Cookie檔案是以ASCII編碼格式儲存的,佔2個位元組,而中文則屬於Unicode中的(Unicode包含世界上所有語言的符號,當然包括咱的漢字了)字元,佔4個字元。
所以,如果想在Cookie中儲存中文的話,必需得進行相應的編碼後才能正確儲存,讀取時再解碼。
一般使用java.net.URLEncoder.encode(String s,String enc)進行編碼,會得到application/x-www-form-urlencoded MIME字串。
使用java.net.URLDecoder.decode(String s,String enc)進行解碼。
兩個方法中的第二參數,一般預設為UTF-8即可。
Java代碼
代碼如下 |
複製代碼 |
<%@ page language="java" contentType="text/html; charset=UTF-8" %> <jsp:directive.page import="java.net.*"/> <% Cookie cookie = new Cookie( URLEncoder.encode("姓名","UTF-8"), URLEncoder.encode("李佳龍","UTF-8") ); response.addCookie(cookie); %> <html> <title>Cookie-中文</title> <body> <% if(request.getCookies()!=null) { for(Cookie coo : request.getCookies()) { String name =URLDecoder.decode(coo.getName(),"UTF-8"); String value = URLDecoder.decode(coo.getValue(),"UTF-8"); out.println(name+"-- "+value); } } %> </body> </html> |
application/x-www-form-urlencoded類似於我們在瀏覽器地址欄中經常看到的那些帶有百分比符號的符號,比如。使用Google瀏覽器搜尋"姓名",最後產生的URL為: