# JSPCookie 處理
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=cms.yiniuedu.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 的域名,比如 cms.yiniuedu.com |
| 2 | **public String getDomain()**
獲取 cookie 的域名,比如 cms.yiniuedu.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">
<title>JSP教程</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**,將會得到如下結果:

可以看到名為 "name" 的 cookie 已經不見了。
您也可以手動在瀏覽器中刪除 cookie。IE 瀏覽器通過點擊 Tools 菜單項,然后選擇 Internet Options,點擊 Delete Cookies,就能刪除所有 cookie 。
- Java Web項目開發學習手冊
- 一、B/S開發環境搭建
- 1.1 tomcat服務器目錄結構及作用
- 1.2 在IDE開發工具上配置tomcat服務器
- 1.3 簡單web項目在tomcat服務器上運行的方法
- 1.4 開發工具設置
- 1.5 總結
- 二、Servlet技術應用
- 2.1 HttpServlet中的主要方法及應用
- 2.1.1 基于Eclipse完成一個JavaWeb項目
- 2.2 HttpRequest,HttpResponse的應用
- 2.2.1客戶端請求
- 2.2.2服務器響應
- 2.2.3Servlet HTTP 狀態碼
- 2.2.4圖片驗證碼類
- 2.2.5注冊模擬實現(帶驗證碼)
- 2.3 ServletConfig對象和ServletContext對象的概念
- 2.4 總結
- 三、JSP技術應用
- 3.1 JSP基本語法
- 3.2 JSP標簽和指令
- 3.3 JSP中的隱式對象
- 3.4 常用應用操作
- 3.4.1 JSP客戶端請求
- 3.4.2 JSP服務器響應
- 3.4.3 HTTP狀態碼
- 3.4.4 表單處理
- 3.4.5 過濾器
- 3.4.6 Cookie處理
- 3.4.7 Session處理
- 3.4.8 文件上傳
- 3.4.9 日期處理
- 3.4.10 頁面重定向
- 3.4.11 點擊量統計
- 3.4.12 自動刷新
- 3.4.13 發送郵件
- 3.5 JSP高級應用
- 3.5.1 JSP標準標簽庫(JSTL)
- 3.5.2 JSP連接數據庫
- 3.5.3 JSP XML數據處理
- 3.5.4 JSP JavaBean
- 3.5.5 自定義標簽
- 3.5.6 表達式語言
- 3.5.7 異常處理
- 3.5.8 調試
- 3.5.9 JSP國際化
- 3.6 實踐代碼
- 3.6.1 實踐代碼
- 3.6.2 項目實戰
- 3.7 總結
- 四、MVC思想的理解和搭建MVC
- 4.1 MVC設計模式的思想
- 4.2 MVC設計模式的實現步驟
- 4.3 項目實踐
- 4.4 總結
- 五、EL表達式和JSTL技術
- 5.1 EL表達式及其應用
- 5.2 常用的JSTL標簽的應用
- 5.3 項目實踐
- 5.4 總結
- 六、Cookie和Session
- 6.1 cookie對象的概念和應用
- 6.2 session對象的概念和應用
- 6.3 項目實踐
- 6.4 總結
- 七、過濾器技術應用
- 7.1 Filter的概念及應用
- 7.2 Filter、FilterChain、FilterConfig 介紹
- 7.3 用戶登錄過濾案例
- 7.4 項目實戰
- 7.5總結
- 八、異步請求技術
- 8.1 JSON數據格式
- 8.2 使用AJAX實現異步請求
- 8.3 用戶名校驗案例
- 8.4小結
- 綜合項目技術實訓
- 1.BS項目開發項目實戰
- 2.項目需求分析和系統設計
- 2.1需求分析
- 2.2類型模型設計
- 2.3原型設計
- 3.項目數據庫分析和系統設計
- 4.BS項目編程實現
- 4.1搭建框架和命名規約
- 4.2實現步驟
- 4.2.1創建實體類
- 4.2.2創建過濾器類
- 4.2.3創建工具類
- 4.2.4創建DAO接口及其實現類
- 4.2.5創建Service接口及其實現類
- 4.2.6創建測試類
- 4.2.7創建控制器類
- 5.企業開發流程規范
- 6.總結
- 九、練習題及答案
- 企業開發常用技術
- 1.Maven技術
- Java命名規范解讀
- 參考資料
- 開發中常用的應用服務器和Web服務器