JSP的Cookie處理
以下內容引用自http://wiki.jikexueyuan.com/project/jsp/Cookies-handling.html:
Cookies是存儲在客戶端計算機的文本文件,保存各種跟蹤目標的信息。JSP使用底層Servlet技術透明地支持HTTP Cookies。
確定返回用戶有三個步驟:
-
服務器腳本向瀏覽器發送的一系列Cookies。例如姓名、年齡、身份證號碼等。
-
瀏覽器將這個信息存儲在本地機器上,以供將來使用。
- 下次當瀏覽器向Web服務器發送任何請求時,將這些Cookies信息發送給服務器,服務器使用這些信息來識別用戶或可能用於其他目的。
一、Cookie的剖析
Cookie通常設置在一個HTTP標題中(盡管JavaScript也可以在瀏覽器中直接設置Cookie)。設置Cookie的JSP可能發送如下所示的標題信息:
HTTP/1.1 200 OK Date: Fri, 04 Feb 2000 21:03:38 GMT Server: Apache/1.3.9 (UNIX) PHP/4.0b3 Set-Cookie: name=xyz; expires=Friday, 04-Feb-07 22:03:38 GMT; path=/; domain=tutorialspoint.com Connection: close Content-Type: text/html
正如所看見的,Set-Cookie標題包含一個名稱值對,GMT時間,路徑和一個域。名稱和值將被URL編碼。結束字段是在給定的時間和日期之後,向瀏覽器發出指令來“忘記”Cookie。
如果配置瀏覽器來存儲Cookie,然後它會保存這個信息直到截止日期。如果用戶在任何與Cookie的路徑和域相匹配的頁面點擊瀏覽器,它將把Cookie重新發送到服務器。瀏覽器的標題看起來如下所示:
GET / HTTP/1.0 Connection: Keep-Alive User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc) Host: zink.demon.co.uk:1126 Accept: image/gif, */* Accept-Encoding: gzip Accept-Language: en Accept-Charset: iso-8859-1,*,utf-8 Cookie: name=xyz
二、Servlet Cookies方法
下面是與Cookie對象關聯的有用的方法列表,可以在JSP中操作Cookies時使用:
方法 | 描述 |
---|---|
public void setDomain(String pattern) |
此方法設置了Cookie適用的領域,例如jsoft.com。 |
public String getDomain() |
此方法得到了Cookie適用的領域,例如jsoft.com。 |
public void setMaxAge(int expiry) |
該方法設置了在Cookie到期之前需要多少時間(以秒為單位)。如果不設置這個,Cookie只持續到當前會話。 |
public int getMaxAge() |
該方法返回了最大持續時間的Cookie,以秒為單位指定,默認情況下,-1表示Cookie會持續到瀏覽器關閉。 |
public String getName() |
該方法將返回Cookie的名稱。這個名字創建後不能更改。 |
public void setValue(String newValue) |
這個方法設置了與Cookie相關的值。 |
public String getValue() |
這個方法得到了與Cookie相關的值。 |
public void setPath(String uri) |
該方法設置了Cookie應用的路徑。如果不指定路徑,那麽與當前頁面相同的目錄以及子目錄中的所有URL都會返回Cookie。 |
public String getPath() |
該方法獲取Cookie應用的路徑。 |
public void setSecure(boolean flag) |
此方法設置布爾值,該值表明Cookie是否只能通過加密連接發送(例如SSL)。 |
public void setComment(String purpose) |
這種方法指定了描述Cookie目的的評論。如果瀏覽器向用戶展示了這個Cookie,那麽評論是有用的。 |
public String getComment() |
該方法返回描述Cookie目的的評論,如果Cookie沒有評論,那麽返回null。 |
三、用JSP設置Cookies
用JSP設置Cookies包括三個步驟:
(1) 創建一個Cookie對象: 用Cookie的名稱和值調用Cookie構造函數,名稱和值是字符串。
Cookie cookie = new Cookie("key","value");
記住,這個名字和值都不應該包含空格或任何以下字符:
[ ] ( ) = , " / ? @ : ;
(2) 設置最大持續時間: 使用setMaxAge指定Cookie的有效期是多長時間(以秒為單位)。以下是建立了一個持續24小時的Cookie。
cookie.setMaxAge(60*60*24);
(3) 將Cookie發送到HTTP響應標題中:使用response.addCookie在HTTP響應標題中添加Cookies,如下所示:
response.addCookie(cookie);
示例:
<% // Create cookies for first and last names. Cookie firstName = new Cookie("first_name", request.getParameter("first_name")); Cookie lastName = new Cookie("last_name", request.getParameter("last_name")); // Set expiry date after 24 Hrs for both the cookies. firstName.setMaxAge(60*60*24); lastName.setMaxAge(60*60*24); // Add both the cookies in the response header. 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>
將上述代碼添加到main.jsp文件中,並在下述的HTML頁面中使用:
<html> <body> <form action="main.jsp" method="GET"> First Name: <input type="text" name="first_name"> <br /> Last Name: <input type="text" name="last_name" /> <input type="submit" value="Submit" /> </form> </body> </html>
將上述HTML內容保存在hello.jsp文件中。當訪問http://localhost:8080/hello.jsp時,這是表單上的實際輸出。
嘗試輸入姓名,然後單擊Submit按鈕。這將在屏幕上顯示姓名,同時會設置firstName和lastName這兩個Cookie,當下次點擊Submit按鈕時,將傳回服務器。
四、用JSP讀取Cookies
想要讀取Cookie,需要通過調用HttpServletRequest的getCookies()方法創建一個javax.servlet.http數組。然後通過數組循環,使用getName()和getValue()方法來訪問每個cookie和相關的值。
示例:
<html> <head> <title>Reading Cookies</title> </head> <body> <center> <h1>Reading Cookies</h1> </center> <% Cookie cookie = null; Cookie[] cookies = null; // Get an array of Cookies associated with this domain 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>
現在將上面的代碼放在main.jsp文件中並試圖訪問它。如果之前設置first_name cookie為“John”,last_name cookie 為“Player”,然後運行http:// localhost:8080/main.jsp
,將顯示下面的結果:
五、用JSP刪除Cookies
刪除Cookies非常簡單。如果想刪除一個Cookie,那麽只需要按照以下三步來處理:
-
讀取一個已經存在的Cookie並把它保存在Cookie對象中。
-
使用setMaxAge()方法將Cookie的持續時間設置為0來刪除一個已經存在的Cookie。
- 將這個Cookie添加到響應標題中。
示例:
以下的例子中刪除了現存的命名為“first_name”的Cookie,當下次運行main.jsp,JSP時,first_name會返回空值。
<html> <head> <title>Reading Cookies</title> </head> <body> <center> <h1>Reading Cookies</h1> </center> <% Cookie cookie = null; Cookie[] cookies = null; // Get an array of Cookies associated with this domain 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>
現在將上述代碼添加到main.jsp中並嘗試訪問它。它會出現如下所示的結果:
現在嘗試再次運行http://localhost:8080/main.jsp
,只會出現如下所示的一個Cookie:
測試工程:https://github.com/easonjim/5_java_example/tree/master/jspbasics/test9
JSP的Cookie處理