JSP Cookie 處理
JSP Cookie 處理
Cookie 是儲存在客戶機的文字檔案,它們儲存了大量軌跡資訊。在 Servlet 技術基礎上,JSP 顯然能夠提供對 HTTP cookie 的支援。
通常有三個步驟來識別回頭客:
- 伺服器指令碼傳送一系列 cookie 至瀏覽器。比如名字,年齡,ID 號碼等等。
- 瀏覽器在本地機中儲存這些資訊,以備不時之需。
- 當下一次瀏覽器傳送任何請求至伺服器時,它會同時將這些 cookie 資訊傳送給伺服器,然後伺服器使用這些資訊來識別使用者或者幹些其它事情。
本章節將會傳授您如何去設定或重設 cookie 的方法,還有如何訪問它們及如何刪除它們。
JSP Cookie 處理需要對中文進行編碼與解碼,方法如下:
String str = java.net.URLEncoder.encode("中文", "UTF-8"); //編碼 String str = java.net.URLDecoder.decode("編碼後的字串","UTF-8"); // 解碼
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=runoob; expires=Friday, 04-Feb-17 22:03:38 GMT; path=/; domain=runoob.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 的域名,比如 runoob.com |
2 | public String getDomain()獲取 cookie 的域名,比如 runoob.com |
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">
</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 非常簡單。如果您想要刪除一個 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,將會得到如下結果:
可以看到名為 "name" 的 cookie 已經不見了。
您也可以手動在瀏覽器中刪除 cookie。IE 瀏覽器通過點選 Tools 選單項,然後選擇 Internet Options,點選 Delete Cookies,就能刪除所有 cookie