JSP Cookie 處理
Cookie是存儲在客戶機的文本文件,它們保存了大量軌跡信息。 在servlet技術基礎上,JSP顯然能夠提供對HTTP cookie的支持。
通常有三個步驟來識別回頭客:
- 服務器腳本發送一系列cookie至瀏覽器。 比如名字,年齡,ID號碼等等。
- 瀏覽器在本地機中存儲這些信息,以備不時之需。
- 當下一次瀏覽器發送任何請求至服務器時,它會同時將這些cookie信息發送給服務器,然後服務器使用這些信息來識別用戶或者乾些其它事情。
本章節將會傳授您如何去設置或重設cookie的方法,還有如何訪問它們及如何刪除它們。
JSP Cookie 處理需要對中文進行編碼與解碼,方法如下:
String str = java.net.URLEncoder.encode("中文"); //编码 String str = java.net.URLDecoder.decode("编码后的字符串"); // 解码
Cookie 剖析
Cookie通常在HTTP信息頭中設置(雖然JavaScript能夠直接在瀏覽器中設置cookie)。 在JSP中,設置一個cookie需要發送如下的信息頭給服務器:
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=w3big; expires=Friday, 04-Feb-07 22:03:38 GMT; path=/; domain=w3big.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,這個方法會返回一個Cookie對象的數組。
Servlet Cookie 方法
下表列出了Cookie對像中常用的方法:
序號 | 方法 & 描述 |
---|---|
1 | public void setDomain(String pattern) 設置cookie的域名,比如w3cschool.cc |
2 | public String getDomain() 獲取cookie的域名,比如w3cschool.cc |
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
使用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()函數來向HTTP響應頭中添加cookie。
response.addCookie(cookie);
實例演示
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"); // 设置 name 和 url cookie Cookie name = new Cookie("name", str); Cookie url = new Cookie("url", request.getParameter("url")); // 设置cookie过期时间为24小时。 name.setMaxAge(60*60*24); url.setMaxAge(60*60*24); // 在响应头部添加cookie response.addCookie( name ); response.addCookie( url ); %> <html> <head> <title>设置 Cookie</title> </head> <body> <h1>设置 Cookie</h1> <ul> <li><p><b>网站名:</b> <%= request.getParameter("name")%> </p></li> <li><p><b>网址:</b> <%= request.getParameter("url")%> </p></li> </ul> </body> </html>
以下是一個簡單的HTML 表單通過GET方法將客戶端數據提交到main.jsp 文件中,並設置cookie:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3big.com)</title> </head> <body> <form action="main.jsp" method=GET> 站点名: <input type="text" name="name"> <br /> 网址: <input type="text" name="url" /> <input type="submit" value="提交" /> </form> </body> </html>
將以上HTML代碼保存到test.htm文件中。
將該文件放置於當前jsp項目的WebContent 目錄下(與main.jsp 同一個目錄)。
通過訪問http://localhost:8080/testjsp/test.html 提交表單數據到main.jsp 文件,演示Gif 圖如下所示:
試著輸入"站點名" 和"網址",然後點擊提交按鈕,它將會在您的屏幕中顯示"站點名" 和"網址",並且設置"站點名" 和"網址" 的兩個cookie。
使用JSP 讀取Cookie
想要讀取cookie,您就需要調用request.getCookies()方法來獲得一個javax.servlet.http.Cookie對象的數組,然後遍歷這個數組,使用getName()方法和getValue()方法來獲取每一個cookie的名稱和值。
讓我們來讀取上個例子中的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的数据,是一个数组 cookies = request.getCookies(); if( cookies != null ){ out.println("<h2> 查找 Cookie 名与值</h2>"); for (int i = 0; i < cookies.length; i++){ cookie = cookies[i]; out.print("参数名 : " + cookie.getName()); out.print("<br>"); out.print("参数值: " + URLDecoder.decode(cookie.getValue(), "utf-8") +" <br>"); out.print("------------------------------------<br>"); } }else{ out.println("<h2>没有发现 Cookie</h2>"); } %> </body> </html>
瀏覽器訪問後,輸出結果為:
使用JSP刪除Cookie
刪除cookie非常簡單。 如果您想要刪除一個cookie,按照下面給的步驟來做就行了:
- 獲取一個已經存在的cookie然後存儲在Cookie對像中。
- 將cookie的有效期設置為0。
- 將這個cookie重新添加進響應頭中。
實例演示
下面的程序刪除一個名為"name"的cookie,當您第二次運行cookie.jsp時,name 將會為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; // 获取当前域名下的cookies,是一个数组 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("参数名 : " + cookie.getName()); out.print("<br>"); out.print("参数值: " + URLDecoder.decode(cookie.getValue(), "utf-8") +" <br>"); out.print("------------------------------------<br>"); } }else{ out.println("<h2>没有发现 Cookie</h2>"); } %> </body> </html>
通過瀏覽器訪問,輸出結果為:
再次訪問http://localhost:8080/testjsp/cookie.jsp ,將會得到如下結果:
可以看到名為width="70%" "name" 的cookie 已經不見了。
您也可以手動在瀏覽器中刪除cookie。 IE 瀏覽器通過點擊Tools菜單項,然後選擇Internet Options,點擊Delete Cookies,就能刪除所有cookie 。