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=php; expires=Friday, 04-Feb-07 22:03:38 GMT; 
                 path=/; domain=php.cn
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的存活時間
                    4public int getMaxAge()


# 取得cookie有效期,以秒為單位,預設為-1 ,表示cookie會活到瀏覽器關閉為止
                    5public String getName()


# 傳回 cookie的名稱,創建後將無法修改
                    6public void setValue(String newValue)


# 設定 cookie的值
                    7public String getValue()


# 取得cookie的值
                    8public void setPath(String uri)


設定cookie 的路徑,預設為目前頁目錄下的所有URL,還有此目錄下的所有子目錄
                    9public String getPath()


# 取得cookie 的路徑
                    10public void setSecure(boolean flag)


指明cookie是否要加密傳送
                    11public void setComment(String purpose)


# 設定註釋描述 cookie的目的。當瀏覽器將cookie展現給使用者時,註解將會變得非常有用
                    12public 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>php中文网(php.cn)</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的名稱和值。

<h3實例示範< h3="">

讓我們來讀取上個範例中的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>

瀏覽器存取後,輸出結果為:

C6A7341F-029A-4244-8B38-BE010E391091.jpg


        使用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>

透過瀏覽器訪問,輸出結果為:

C6A7341F-029A-4244-8B38-BE010E391091.jpg

再次造訪http://localhost:8080/testjsp/cookie.jsp,將會得到下列結果:

7BF1C669-F7A4-4245-B7B0-B79BBB272604.jpg

可以看到名為width="70%" "name" 的cookie 已經不見了。

您也可以手動在瀏覽器中刪除 cookie。 IE 瀏覽器點選Tools選單項,然後選擇Internet Options,點選 Delete Cookies,就能刪除所有 cookie 。