1. 程式人生 > >JSP的Cookie處理

JSP的Cookie處理

coo 情況 target 年齡 setting boolean head .get linu

以下內容引用自http://wiki.jikexueyuan.com/project/jsp/Cookies-handling.html:

Cookies是存儲在客戶端計算機的文本文件,保存各種跟蹤目標的信息。JSP使用底層Servlet技術透明地支持HTTP Cookies。

確定返回用戶有三個步驟:

  • 服務器腳本向瀏覽器發送的一系列Cookies。例如姓名、年齡、身份證號碼等。

  • 瀏覽器將這個信息存儲在本地機器上,以供將來使用。

  • 下次當瀏覽器向Web服務器發送任何請求時,將這些Cookies信息發送給服務器,服務器使用這些信息來識別用戶或可能用於其他目的。

一、Cookie的剖析

Cookie通常設置在一個HTTP標題中(盡管JavaScript也可以在瀏覽器中直接設置Cookie)。設置Cookie的JSP可能發送如下所示的標題信息:

HTTP/1.1 200 OK
Date: Fri, 04 Feb 2000 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name=xyz; expires=Friday, 04-Feb-07 22:03:38 GMT; 
                 path=/; domain=tutorialspoint.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

二、Servlet Cookies方法

下面是與Cookie對象關聯的有用的方法列表,可以在JSP中操作Cookies時使用:

方法 描述

public void setDomain(String pattern)

此方法設置了Cookie適用的領域,例如jsoft.com。

public String getDomain()

此方法得到了Cookie適用的領域,例如jsoft.com。

public void setMaxAge(int expiry)

該方法設置了在Cookie到期之前需要多少時間(以秒為單位)。如果不設置這個,Cookie只持續到當前會話。

public int getMaxAge()

該方法返回了最大持續時間的Cookie,以秒為單位指定,默認情況下,-1表示Cookie會持續到瀏覽器關閉。

public String getName()

該方法將返回Cookie的名稱。這個名字創建後不能更改。

public void setValue(String newValue)

這個方法設置了與Cookie相關的值。

public String getValue()

這個方法得到了與Cookie相關的值。

public void setPath(String uri)

該方法設置了Cookie應用的路徑。如果不指定路徑,那麽與當前頁面相同的目錄以及子目錄中的所有URL都會返回Cookie。

public String getPath()

該方法獲取Cookie應用的路徑。

public void setSecure(boolean flag)

此方法設置布爾值,該值表明Cookie是否只能通過加密連接發送(例如SSL)。

public void setComment(String purpose)

這種方法指定了描述Cookie目的的評論。如果瀏覽器向用戶展示了這個Cookie,那麽評論是有用的。

public String getComment()

該方法返回描述Cookie目的的評論,如果Cookie沒有評論,那麽返回null。

三、用JSP設置Cookies

用JSP設置Cookies包括三個步驟:

(1) 創建一個Cookie對象: 用Cookie的名稱和值調用Cookie構造函數,名稱和值是字符串。

Cookie cookie = new Cookie("key","value");

記住,這個名字和值都不應該包含空格或任何以下字符:

[ ] ( ) = , " / ? @ : ;

(2) 設置最大持續時間: 使用setMaxAge指定Cookie的有效期是多長時間(以秒為單位)。以下是建立了一個持續24小時的Cookie。

cookie.setMaxAge(60*60*24); 

(3) 將Cookie發送到HTTP響應標題中:使用response.addCookie在HTTP響應標題中添加Cookies,如下所示:

response.addCookie(cookie);

示例:

<%
   // Create cookies for first and last names.      
   Cookie firstName = new Cookie("first_name",
              request.getParameter("first_name"));
   Cookie lastName = new Cookie("last_name",
              request.getParameter("last_name"));

   // Set expiry date after 24 Hrs for both the cookies.
   firstName.setMaxAge(60*60*24); 
   lastName.setMaxAge(60*60*24); 

   // Add both the cookies in the response header.
   response.addCookie( firstName );
   response.addCookie( lastName );
%>
<html>
<head>
<title>Setting Cookies</title>
</head>
<body>
<center>
<h1>Setting Cookies</h1>
</center>
<ul>
<li><p><b>First Name:</b>
   <%= request.getParameter("first_name")%>
</p></li>
<li><p><b>Last  Name:</b>
   <%= request.getParameter("last_name")%>
</p></li>
</ul>
</body>
</html>

將上述代碼添加到main.jsp文件中,並在下述的HTML頁面中使用:

<html>
<body>
<form action="main.jsp" method="GET">
First Name: <input type="text" name="first_name">
<br />
Last Name: <input type="text" name="last_name" />
<input type="submit" value="Submit" />
</form>
</body>
</html>

將上述HTML內容保存在hello.jsp文件中。當訪問http://localhost:8080/hello.jsp時,這是表單上的實際輸出。

技術分享

嘗試輸入姓名,然後單擊Submit按鈕。這將在屏幕上顯示姓名,同時會設置firstName和lastName這兩個Cookie,當下次點擊Submit按鈕時,將傳回服務器。

四、用JSP讀取Cookies

想要讀取Cookie,需要通過調用HttpServletRequest的getCookies()方法創建一個javax.servlet.http數組。然後通過數組循環,使用getName()和getValue()方法來訪問每個cookie和相關的值。

示例:

<html>
<head>
<title>Reading Cookies</title>
</head>
<body>
<center>
<h1>Reading Cookies</h1>
</center>
<%
   Cookie cookie = null;
   Cookie[] cookies = null;
   // Get an array of Cookies associated with this domain
   cookies = request.getCookies();
   if( cookies != null ){
      out.println("<h2> Found Cookies Name and Value</h2>");
      for (int i = 0; i < cookies.length; i++){
         cookie = cookies[i];
         out.print("Name : " + cookie.getName( ) + ",  ");
         out.print("Value: " + cookie.getValue( )+" <br/>");
      }
  }else{
      out.println("<h2>No cookies founds</h2>");
  }
%>
</body>
</html>

現在將上面的代碼放在main.jsp文件中並試圖訪問它。如果之前設置first_name cookie為“John”,last_name cookie 為“Player”,然後運行http:// localhost:8080/main.jsp,將顯示下面的結果:

技術分享

五、用JSP刪除Cookies

刪除Cookies非常簡單。如果想刪除一個Cookie,那麽只需要按照以下三步來處理:

  • 讀取一個已經存在的Cookie並把它保存在Cookie對象中。

  • 使用setMaxAge()方法將Cookie的持續時間設置為0來刪除一個已經存在的Cookie。

  • 將這個Cookie添加到響應標題中。

示例:

以下的例子中刪除了現存的命名為“first_name”的Cookie,當下次運行main.jsp,JSP時,first_name會返回空值。

<html>
<head>
<title>Reading Cookies</title>
</head>
<body>
<center>
<h1>Reading Cookies</h1>
</center>
<%
   Cookie cookie = null;
   Cookie[] cookies = null;
   // Get an array of Cookies associated with this domain
   cookies = request.getCookies();
   if( cookies != null ){
      out.println("<h2> Found Cookies Name and Value</h2>");
      for (int i = 0; i < cookies.length; i++){
         cookie = cookies[i];
         if((cookie.getName( )).compareTo("first_name") == 0 ){
            cookie.setMaxAge(0);
            response.addCookie(cookie);
            out.print("Deleted cookie: " + 
            cookie.getName( ) + "<br/>");
         }
         out.print("Name : " + cookie.getName( ) + ",  ");
         out.print("Value: " + cookie.getValue( )+" <br/>");
      }
  }else{
      out.println(
      "<h2>No cookies founds</h2>");
  }
%>
</body>
</html>

現在將上述代碼添加到main.jsp中並嘗試訪問它。它會出現如下所示的結果:

技術分享

現在嘗試再次運行http://localhost:8080/main.jsp,只會出現如下所示的一個Cookie:

技術分享

測試工程:https://github.com/easonjim/5_java_example/tree/master/jspbasics/test9

JSP的Cookie處理