1. 程式人生 > 實用技巧 >JSP Cookie 處理

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 通常在 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 物件的陣列。


下表列出了 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 包含三個步驟:

(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。

刪除 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