JSP Cookie 處理
Cookie是存儲(chǔ)在客戶機(jī)的文本文件,它們保存了大量軌跡信息。在servlet技術(shù)基礎(chǔ)上,JSP顯然能夠提供對HTTP cookie的支持。
通常有三個(gè)步驟來識(shí)別回頭客:
服務(wù)器腳本發(fā)送一系列cookie至瀏覽器。比如名字,年齡,ID號(hào)碼等等。
瀏覽器在本地機(jī)中存儲(chǔ)這些信息,以備不時(shí)之需。
當(dāng)下一次瀏覽器發(fā)送任何請求至服務(wù)器時(shí),它會(huì)同時(shí)將這些cookie信息發(fā)送給服務(wù)器,然后服務(wù)器使用這些信息來識(shí)別用戶或者干些其它事情。
本章節(jié)將會(huì)傳授您如何去設(shè)置或重設(shè)cookie的方法,還有如何訪問它們及如何刪除它們。
JSP Cookie 處理需要對中文進(jìn)行編碼與解碼,方法如下:
String str = java.net.URLEncoder.encode("中文"); //編碼 String str = java.net.URLDecoder.decode("編碼后的字符串"); // 解碼
Cookie 剖析
Cookie通常在HTTP信息頭中設(shè)置(雖然JavaScript能夠直接在瀏覽器中設(shè)置cookie)。在JSP中,設(shè)置一個(gè)cookie需要發(fā)送如下的信息頭給服務(wù)器:
HTTP/1.1 200 OK Date: Fri, 04 Feb 2015 21:03:38 GMT Server: Apache/1.3.9 (UNIX) PHP/4.0b3 Set-Cookie: name=php; expires=Friday, 04-Feb-07 22:03:38 GMT; path=/; domain=php.cn Connection: close Content-Type: text/html
正如您所見,Set-Cookie信息頭包含一個(gè)鍵值對,一個(gè)GMT(格林尼治標(biāo)準(zhǔn))時(shí)間,一個(gè)路徑,一個(gè)域名。鍵值對會(huì)被編碼為URL。有效期域是個(gè)指令,告訴瀏覽器在什么時(shí)候之后就可以清除這個(gè)cookie。
如果瀏覽器被配置成可存儲(chǔ)cookie,那么它將會(huì)保存這些信息直到過期。如果用戶訪問的任何頁面匹配了cookie中的路徑和域名,那么瀏覽器將會(huì)重新將這個(gè)cookie發(fā)回給服務(wù)器。瀏覽器端的信息頭長得就像下面這樣:
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,這個(gè)方法會(huì)返回一個(gè)Cookie對象的數(shù)組。
Servlet Cookie 方法
下表列出了Cookie對象中常用的方法:
序號(hào) | 方法 & 描述 |
---|---|
1 | public void setDomain(String pattern) |
2 | public String getDomain() |
3 | public void setMaxAge(int expiry) |
4 | public int getMaxAge() |
5 | public String getName() |
6 | public void setValue(String newValue) |
7 | public String getValue() |
8 | public void setPath(String uri) |
9 | public String getPath() |
10 | public void setSecure(boolean flag) |
11 | public void setComment(String purpose) |
12 | public String getComment() |
使用JSP設(shè)置Cookie
使用JSP設(shè)置cookie包含三個(gè)步驟:
(1)創(chuàng)建一個(gè)Cookie對象: 調(diào)用Cookie的構(gòu)造函數(shù),使用一個(gè)cookie名稱和值做參數(shù),它們都是字符串。
Cookie cookie = new Cookie("key","value");
請務(wù)必牢記,名稱和值中都不能包含空格或者如下的字符:
[ ] ( ) = , " / ? @ : ;
(2) 設(shè)置有效期:調(diào)用setMaxAge()函數(shù)表明cookie在多長時(shí)間(以秒為單位)內(nèi)有效。下面的操作將有效期設(shè)為了24小時(shí)。
cookie.setMaxAge(60*60*24);
(3) 將cookie發(fā)送至HTTP響應(yīng)頭中:調(diào)用response.addCookie()函數(shù)來向HTTP響應(yīng)頭中添加cookie。
response.addCookie(cookie);
實(shí)例演示
main.jsp 文件代碼如下所示:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.net.*" %> <% // 編碼,解決中文亂碼 String str = URLEncoder.encode(request.getParameter("name"),"utf-8"); // 設(shè)置 name 和 url cookie Cookie name = new Cookie("name", str); Cookie url = new Cookie("url", request.getParameter("url")); // 設(shè)置cookie過期時(shí)間為24小時(shí)。 name.setMaxAge(60*60*24); url.setMaxAge(60*60*24); // 在響應(yīng)頭部添加cookie response.addCookie( name ); response.addCookie( url ); %> <html> <head> <title>設(shè)置 Cookie</title> </head> <body> <h1>設(shè)置 Cookie</h1> <ul> <li><p><b>網(wǎng)站名:</b> <%= request.getParameter("name")%> </p></li> <li><p><b>網(wǎng)址:</b> <%= request.getParameter("url")%> </p></li> </ul> </body> </html>
以下是一個(gè)簡單的 HTML 表單通過GET方法將客戶端數(shù)據(jù)提交到 main.jsp 文件中,并設(shè)置 cookie:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文網(wǎng)(php.cn)</title> </head> <body> <form action="main.jsp" method=GET> 站點(diǎn)名: <input type="text" name="name"> <br /> 網(wǎng)址: <input type="text" name="url" /> <input type="submit" value="提交" /> </form> </body> </html>
將以上HTML代碼保存到test.htm文件中。
將該文件放置于當(dāng)前jsp項(xiàng)目的 WebContent 目錄下(與 main.jsp 同一個(gè)目錄)。
通過訪問 http://localhost:8080/testjsp/test.html 提交表單數(shù)據(jù)到 main.jsp 文件,演示 Gif 圖如下所示:
試著輸入 "站點(diǎn)名" 和 "網(wǎng)址",然后點(diǎn)擊提交按鈕,它將會(huì)在您的屏幕中顯示 "站點(diǎn)名" 和 "網(wǎng)址",并且設(shè)置 "站點(diǎn)名" 和 "網(wǎng)址" 的兩個(gè) cookie。
使用 JSP 讀取 Cookie
想要讀取cookie,您就需要調(diào)用request.getCookies()方法來獲得一個(gè)javax.servlet.http.Cookie對象的數(shù)組,然后遍歷這個(gè)數(shù)組,使用getName()方法和getValue()方法來獲取每一個(gè)cookie的名稱和值。
<h3實(shí)例演示< h3="">讓我們來讀取上個(gè)例子中的cookie, 以下為 cookie.jsp 文件代碼:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.net.*" %> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>獲取 Cookie</title> </head> <body> <% Cookie cookie = null; Cookie[] cookies = null; // 獲取cookies的數(shù)據(jù),是一個(gè)數(shù)組 cookies = request.getCookies(); if( cookies != null ){ out.println("<h2> 查找 Cookie 名與值</h2>"); for (int i = 0; i < cookies.length; i++){ cookie = cookies[i]; out.print("參數(shù)名 : " + cookie.getName()); out.print("<br>"); out.print("參數(shù)值: " + URLDecoder.decode(cookie.getValue(), "utf-8") +" <br>"); out.print("------------------------------------<br>"); } }else{ out.println("<h2>沒有發(fā)現(xiàn) Cookie</h2>"); } %> </body> </html>
瀏覽器訪問后,輸出結(jié)果為:
使用JSP刪除Cookie
刪除cookie非常簡單。如果您想要?jiǎng)h除一個(gè)cookie,按照下面給的步驟來做就行了:
獲取一個(gè)已經(jīng)存在的cookie然后存儲(chǔ)在Cookie對象中。
將cookie的有效期設(shè)置為0。
將這個(gè)cookie重新添加進(jìn)響應(yīng)頭中。
實(shí)例演示
下面的程序刪除一個(gè)名為"name"的cookie,當(dāng)您第二次運(yùn)行cookie.jsp時(shí),name 將會(huì)為 null。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.net.*" %> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>獲取 Cookie</title> </head> <body> <% Cookie cookie = null; Cookie[] cookies = null; // 獲取當(dāng)前域名下的cookies,是一個(gè)數(shù)組 cookies = request.getCookies(); if( cookies != null ){ out.println("<h2> 查找 Cookie 名與值</h2>"); for (int i = 0; i < cookies.length; i++){ cookie = cookies[i]; if((cookie.getName( )).compareTo("name") == 0 ){ cookie.setMaxAge(0); response.addCookie(cookie); out.print("刪除 Cookie: " + cookie.getName( ) + "<br/>"); } out.print("參數(shù)名 : " + cookie.getName()); out.print("<br>"); out.print("參數(shù)值: " + URLDecoder.decode(cookie.getValue(), "utf-8") +" <br>"); out.print("------------------------------------<br>"); } }else{ out.println("<h2>沒有發(fā)現(xiàn) Cookie</h2>"); } %> </body> </html>
通過瀏覽器訪問,輸出結(jié)果為:
再次訪問 http://localhost:8080/testjsp/cookie.jsp,將會(huì)得到如下結(jié)果:
可以看到名為 width="70%" "name" 的 cookie 已經(jīng)不見了。
您也可以手動(dòng)在瀏覽器中刪除 cookie。IE 瀏覽器通過點(diǎn)擊Tools菜單項(xiàng),然后選擇Internet Options,點(diǎn)擊 Delete Cookies,就能刪除所有 cookie 。