JSP Cookies處理
Cookie是存儲在客戶端計算機上的文本文件,它們保存為各種信息跟蹤的目的。 JSP中使用透明底層的servlet技術支持HTTP Cookie。
有參與確定返回用戶的三個步驟:
-
服務器腳本發送一組cookies給瀏覽器。例如姓名,年齡,或標識號等等。
-
瀏覽器存儲在本地計算機上這些信息以備將來使用。
-
當下次瀏覽器發送任何請求的Web服務器,然後發送這些Cookie的信息到服務器,服務器將使用這些信息來識彆用戶,也可以是用於其他目的也是如此。
本章將教你如何設置或重置的cookies,如何訪問它們,以及如何使用JSP程序來刪除它們。
Cookie剖析:
這時候,Cookies通常在HTTP頭設置(雖然JavaScript的也可以直接在瀏覽器上設置cookie)。一個JSP,設置一個cookie會發送標頭,看起來像這樣:
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=yiibai.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
JSP腳本將通過請求方法request.getCookies(),它返回一個Cookie對象的數組訪問的cookies。
Servlet Cookies 方法:
以下是與Cookie對象相關聯的有用的方法,你可以使用,在JSP操作Cookie的列表:
S.N. | 方法 & 描述 |
---|---|
1 |
public void setDomain(String pattern) This method sets the domain to which cookie applies, for example gitbook.net. |
2 |
public String getDomain() This method gets the domain to which cookie applies, for example gitbook.net. |
3 |
public void setMaxAge(int expiry) This method sets how much time (in seconds) should elapse before the cookie expires. If you don't set this, the cookie will last only for the current session. |
4 |
public int getMaxAge() This method returns the maximum age of the cookie, specified in seconds, By default, -1 indicating the cookie will persist until browser shutdown. |
5 |
public String getName() This method returns the name of the cookie. The name cannot be changed after creation. |
6 |
public void setValue(String newValue) This method sets the value associated with the cookie. |
7 |
public String getValue() This method gets the value associated with the cookie. |
8 |
public void setPath(String uri) This method sets the path to which this cookie applies. If you don't specify a path, the cookie is returned for all URLs in the same directory as the current page as well as all subdirectories. |
9 |
public String getPath() This method gets the path to which this cookie applies. |
10 |
public void setSecure(boolean flag) This method sets the boolean value indicating whether the cookie should only be sent over encrypted (i.e. SSL) connections. |
11 |
public void setComment(String purpose) This method specifies a comment that describes a cookie's purpose. The comment is useful if the browser presents the cookie to the user. |
12 |
public String getComment() This method returns the comment describing the purpose of this cookie, or null if the cookie has no comment. |
使用JSP設置cookie:
設置cookie使用JSP包含三個步驟:
(1)創建一個Cookie對象: 在調用Cookie的構造函數用一個cookie名稱和cookie值,這兩者都是字符串。
Cookie cookie = new Cookie("key","value");
請記住,無論是名稱或是值應該包含空格或以下任何字符:
[ ] ( ) = , " / ? @ : ;
(2) 設置最長期限: 使用setMaxAge到指定cookie應該多長時間(以秒計)是有效的。下麵將設立cookie為24小時。
cookie.setMaxAge(60*60*24);
(3) 發送Cookie到HTTP響應頭:可以使用response.addCookie在HTTP響應頭添加的cookies如下:
response.addCookie(cookie);
示例:
讓我們修改我們的表單示例設置的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並把hello.jsp和main.jsp 在 <Tomcat-installation-directory>/webapps/ ROOT目錄。當您訪問http://localhost:8080/hello.jsp,這裡是上述表單的實際輸出。
嘗試輸入First Name和Last Name,然後單擊提交按鈕。這將顯示姓氏和名字在屏幕上,並同時將設置兩個cookie firstName和lastName這將被傳遞回時,下一次你按提交按鈕提交到服務器。
下一節將說明如何訪問這些Cookie的備份在Web應用程序。
使用JSP讀取Cookie:
要讀取Cookie,則需要通過調用HttpServletRequest的thegetCookies()方法來創建javax.servlet.http.Cookie對象的數組。然後循環遍曆數組,並使用的getName()和getValue()方法來訪問每個cookie和相關的值。
例子:
讓我們讀取在前麵的例子中已經設置的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文件,然後嘗試訪問它。如果您想設置的cookie first_name 為“約翰”和last_name cookie為“Player”,然後運行http://localhost:8080/main.jsp會顯示以下結果:
Found Cookies Name and ValueName : first_name, Value: JohnName : last_name, Value: Player |
用JSP刪除Cookies:
刪除Cookie是非常簡單的。如果你想刪除一個cookie,那麼你隻需要跟進以下三個步驟:
-
讀一個已經存在的Cookie,並將其存儲在Cookie對象。
-
使用的setMaxAge()方法來刪除現有的cookie設置cookie的年齡為零。
-
加入這個cookie返回到響應頭。
例子:
下麵的例子將刪除並命名為“first_name”,當您將運行main.jsp的JSP下次現有的Cookie,將返回first_name的值為null。
<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文件,然後嘗試訪問它。它會顯示以下結果:
Cookies Name and ValueDeleted cookie : first_nameName : first_name, Value: John Name : last_name, Value: Player |
現在嘗試運行http://localhost:8080/main.jsp,它應該如下所示隻顯示一個cookie:
Found Cookies Name and ValueName : last_name, Value: Player |
您可以手動刪除Cookie在Internet Explorer。開始在工具菜單並選擇Internet選項。要刪除所有Cookie,請按刪除Cookies。