Cookies是儲存在客戶機的文字文件,它們保存了大量軌跡資訊。在servlet技術基礎上,JSP顯然能夠提供對HTTP cookies的支援。
通常有三個步驟來辨識回頭客:
伺服器腳本發送一系列cookies至瀏覽器。例如名字,年齡,ID號碼等等。
瀏覽器在本機中儲存這些信息,以備不時之需。
當下一次瀏覽器發送任何請求至伺服器時,它會同時將這些cookies資訊傳送給伺服器,然後伺服器使用這些資訊來識別使用者或乾些其它事情。
本章節將會教您如何去設定或重設cookie的方法,以及如何存取它們及如何刪除它們。
Cookies通常在HTTP資訊頭中設定(雖然JavaScript能夠直接在瀏覽器中設定cookies)。在JSP中,設定一個cookie需要傳送如下的訊息頭給伺服器:
HTTP/1.1 200 OKDate: Fri, 04 Feb 2000 21:03:38 GMTServer: Apache/1.3.9 (UNIX) PHP/4.0b3Set-Cookie: name=xyz; expires=Friday, 04-Feb-07 22:03 38 GMT; path=/; domain=tutorialspoint.comConnection: closeContent-Type: text/html
如您所見,Set-Cookie資訊頭包含一個鍵值對,一個GMT(格林尼治標準)時間,一個路徑,一個網域名稱。鍵值對會被編碼為URL。有效期域是個指令,告訴瀏覽器在什麼時候之後就可以清除這個cookie。
如果瀏覽器被配置成可儲存cookies,那麼它將會保存這些資訊直到過期。如果使用者造訪的任何頁面都符合了cookie中的路徑和域名,那麼瀏覽器將會重新將這個cookie傳回給伺服器。瀏覽器端的資訊頭長得就像下面這樣:
GET / HTTP/1.0Connection: Keep-AliveUser-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)Host: zink.demon.co.uk:1126Accept: image/gif, */*Accept- Encoding: gzipAccept-Language: enAccept-Charset: iso-8859-1,*,utf-8Cookie: name=xyz
JSP腳本透過request物件中的getCookies()方法來存取這些cookies,這個方法會傳回一個Cookie物件的陣列。
下表列出了Cookie物件中常用的方法:
序號 | 方法&描述 |
---|---|
1 | public void setDomain(String pattern)設定cookie的域名,例如w3cschool.cn |
2 | public String getDomain()取得cookie的域名,例如w3cschool.cn |
3 | public void setMaxAge(int expiry)設定cookie有效期,以秒為單位,預設有效期為目前session的存活時間 |
4 | public int getMaxAge()取得cookie有效期,以秒為單位,預設為-1 ,表示cookie會活到瀏覽器關閉為止 |
5 | public String getName()傳回cookie的名稱,名稱建立後將無法修改 |
6 | public void setValue(String newValue)設定cookie的值 |
7 | public String getValue()取得cookie的值 |
8 | public void setPath(String uri)設定cookie 的路徑,預設為目前頁面目錄下的所有URL,還有此目錄下的所有子目錄 |
9 | public String getPath()取得cookie 的路徑 |
10 | public void setSecure(boolean flag)指明cookie是否要加密傳輸 |
11 | public void setComment(String purpose)設定註解描述cookie的目的。當瀏覽器將cookie展現給使用者時,註解將會變得非常有用 |
12 | public String getComment()傳回描述cookie目的的註釋,若沒有則回傳null |
使用JSP設定cookie包含三個步驟:
(1)建立一個Cookie物件:呼叫Cookie的建構函數,使用一個cookie名稱和值做參數,它們都是字串。
Cookie cookie = new Cookie("key","value");
請務必牢記,名稱和值中都不能包含空格或如下的字元:
[ ] ( ) = , " / ? @ : ;
(2) 設定有效期限:呼叫setMaxAge()函數表示cookie在多久(以秒為單位)內有效。以下的操作將有效期設為了24小時。
cookie.setMaxAge(60*60*24);
(3) 將cookie傳送至HTTP回應頭中:呼叫response.addCookie()函數來新增cookies至HTTP回應頭。
response.addCookie(cookie);
<% // 為first_name 和last_name設定cookie Cookie firstName = new Cookie("first_name", request.getParameter("first_name")); Cookie lastName = new Cookie("last_name",request.getParameter("last_name")); // 設定cookie過期時間為24小時。 firstName.setMaxAge(60*60*24); lastName.setMaxAge(60*60*24); // 在回應頭部新增cookie response.addCookie( firstName ); response.addCookie( lastName ); %><html>< head><title>Setting Cookies</title></head><body><center><h1>Setting Cookies</h1></center><ul><li><p><b>First Name:</b><%= request.getParameter("first_name")%></p></li>< li><p><b>Last Name:</b> <%= request.getParameter("last_name")%></p></li></ul></body></html>
將上面的檔案放在<Tomcat安裝目錄>/webapps/ROOT目錄下,然後造訪http://localhost:8080/hello.jsp,將會得到以下輸出結果:
試著輸入First Name和Last Name,然後點擊提交按鈕,它將會在您的螢幕中顯示first name和last name,並且設定first name和last name兩個cookie,下一次點擊提交按鈕時會發給伺服器。
想要讀取cookies,您需要呼叫request.getCookies()方法來取得一個javax.servlet.http.Cookie物件的數組,然後遍歷這個數組,使用getName()方法和getValue()方法來取得每個cookie的名稱和值。
讓我們來讀取上個範例中的cookies。
<html><head><title>Reading Cookies</title></head><body><center><h1>Reading Cookies</h1></center><% Cookie cookie = null; Cookie[] cookies = null; // 取得cookies的資料,是一個陣列cookies = request.getCookies(); if( cookies != null ){ out.println("<h2> Found Cookies Name and Value</h2>"); for (int i = 0; i < cookies.length; i++){ cookie = cookies[i]; out.print("Name : " + cookie.getName( ) + ", "); out.print("Value: " + cookie.getValue( )+" <br/>"); } }else{ out.println("<h2>No cookies founds</h2>"); }%></body></html>
如果您將first name cookie設定成"John",last name設定成"Player",造訪http://localhost:8080/main.jsp,將會得到下列輸出結果:
Found Cookies Name and ValueName : first_name, Value: John Name : last_name, Value: Player
刪除cookies非常簡單。如果您想要刪除一個cookie,請按照下面給的步驟來做就行了:
取得一個已經存在的cookie然後儲存在Cookie物件中。
將cookie的有效期設定為0。
將這個cookie重新加入進回應頭中。
下面的程式刪除一個名為"first_name"的cookie,當您下次執行main.jsp時,first_name將會為null。
<html><head><title>Reading Cookies</title></head><body><center> <h1>Reading Cookies</h1></center><% Cookie cookie = null; Cookie[] cookies = null; // 取得目前網域下的cookies,是一個陣列cookies = request.getCookies(); if( cookies != null ){ out.println("<h2> Found Cookies Name and Value</h2>"); for (int i = 0; i < cookies.length; i++){ cookie = cookies[i]; if((cookie.getName( )).compareTo("first_name") == 0 ){ cookie.setMaxAge(0); response.addCookie(cookie); out.print("Deleted cookie: " + cookie.getName( ) + "<br/>"); } out.print("Name : " + cookie.getName( ) + ", "); out.print(" Value: " + cookie.getValue( )+" <br/>"); } }else{ out.println( "<h2>No cookies founds</h2>"); }%></body></html >
訪問它,將會得到以下輸出結果:
Cookies Name and ValueDeleted cookie : first_nameName : first_name, Value: JohnName : last_name, Value: Player
再造訪http://localhost:8080/main.jsp,將會得到以下結果:
Found Cookies Name and ValueName : last_name, Value: Player
您也可以手動在瀏覽器中刪除cookies。點選Tools選單項,然後選擇Internet Options,點選Delete Cookies,就能刪除所有cookies了。