鍍金池/ 教程/ Java/ JSP - Cookies 處理
JSP - 異常處理
JSP - 標(biāo)準(zhǔn)標(biāo)簽庫
JSP - 操作
JSP - 語法
JSP - 概述
JSP - 過濾器
JSP - 文件上傳
JSP - 指令
JSP - 訪問數(shù)據(jù)庫
JSP - 國際化
JSP - 隱式對象
JSP - 面試問題
JSP - 體系結(jié)構(gòu)
JSP - 發(fā)送電子郵件
JSP - 客戶端請求
JSP - 服務(wù)器響應(yīng)
JSP - 表達式語言
JSP - 自定義標(biāo)簽
JSP - HTTP 狀態(tài)碼
JSP - 調(diào)試
JSP - XML 數(shù)據(jù)
JSP - 有用的資源
JSP - 處理日期
JSP - 生命周期
JSP - 會話跟蹤
JSP - JavaBeans
JSP - 自動刷新
JSP - 頁面重定向
JSP - 點擊計數(shù)器
JSP - 安全性
JSP - Cookies 處理
JSP - 環(huán)境配置
JSP - 表單處理

JSP - Cookies 處理

Cookies 是存儲在客戶端計算機的文本文件,保存各種跟蹤目標(biāo)的信息。JSP 使用底層 servlet 技術(shù)透明地支持 HTTP cookies。

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

  • 服務(wù)器腳本向瀏覽器發(fā)送的一系列cookies。例如姓名、年齡、身份證號碼等。

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

  • 下次當(dāng)瀏覽器向web服務(wù)器發(fā)送任何請求時,將這些 cookies 信息發(fā)送給服務(wù)器,服務(wù)器使用這些信息來識別用戶或可能用于其他目的。

本章將教你如何設(shè)置或重置 cookies,如何訪問它們,以及如何使用 JSP 程序刪除它們。

Cookie 的剖析

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

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 標(biāo)題包含一個名稱值對,GMT 時間,路徑和一個域。名稱和 值將被 URL 編碼。結(jié)束字段是在給定的時間和日期之后,向瀏覽器發(fā)出指令來“忘記”cookie。

如果配置瀏覽器來存儲 cookie,然后它會保存這個信息直到截止日期。如果用戶在任何與cookie 的路徑和域相匹配的頁面點擊瀏覽器,它將把 cookie 重新發(fā)送到服務(wù)器。瀏覽器的標(biāo)題看起來如下所示:

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 對象關(guān)聯(lián)的有用的方法列表,你可以在 JSP 中操作 cookies 時使用:

S.N. 方法 & 描述
1

public void setDomain(String pattern)

此方法設(shè)置了 cookie 適用的領(lǐng)域,例如 tutorialspoint.com。

2

public String getDomain()

此方法得到了 cookie 適用的領(lǐng)域,例如 tutorialspoint.com。

3

public void setMaxAge(int expiry)

該方法設(shè)置了在 cookie 到期之前需要多少時間(以秒為單位)。如果你不設(shè)置這個,cookie 只持續(xù)到當(dāng)前會話。

4

public int getMaxAge()

該方法返回了最大持續(xù)時間的 cookie,以秒為單位指定,默認(rèn)情況下,-1表示 cookie 會持續(xù)到瀏覽器關(guān)閉。

5

public String getName()

該方法將返回 cookie 的名稱。這個名字創(chuàng)建后不能更改。

6

public void setValue(String newValue)

這個方法設(shè)置了與 cookie 相關(guān)的值。

7

public String getValue()

這個方法得到了與 cookie相關(guān)的值。

8

public void setPath(String uri)

該方法設(shè)置了 cookie 應(yīng)用的路徑。如果你不指定路徑,那么與當(dāng)前頁面相同的目錄以及子目錄中的所有 URL都會返回 cookie。

9

public String getPath()

該方法獲取 cookie 應(yīng)用的路徑。

10

public void setSecure(boolean flag)

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

11

public void setComment(String purpose)

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

12

public String getComment()

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

用 JSP 設(shè)置 Cookies

用 JSP 設(shè)置 Cookies 包括三個步驟:

(1) 創(chuàng)建一個 Cookie 對象: 用 cookie 的名稱和值調(diào)用 cookie 構(gòu)造函數(shù),名稱和值是字符串。

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

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

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

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

cookie.setMaxAge(60*60*24); 

(3) 將 cookie 發(fā)送到 HTTP 響應(yīng)標(biāo)題中: 使用 response.addCookie 在 HTTP 響應(yīng)標(biāo)題中添加 cookies,如下所示:

response.addCookie(cookie);

示例:

讓我們修改 表單示例 為名稱設(shè)置 cookies。

<%
   // 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 內(nèi)容保存在hello.jsp 文件中,并將hello.jsp 和 main.jsp 添加到 < Tomcat-installation-directory > / webapps /ROOT 目錄中。當(dāng)你訪問 http:// localhost:8080/hello.jsp時,這是表單上的實際輸出。

First Name:
Last Name:

嘗試輸入姓名,然后單擊 submit 按鈕。這將在你的屏幕上顯示姓名,同時會設(shè)置 firstName 和 lastName 這兩個 cookie,當(dāng)你下次點擊 submit 按鈕時,將傳回服務(wù)器。

下一節(jié)將解釋如何在你的web應(yīng)用程序中訪問這些 cookies。

用 JSP 讀取 Cookies

想要讀取 cookie,你需要通過調(diào)用 HttpServletRequest 的 getCookies() 方法創(chuàng)建一個 javax.servlet.http 數(shù)組。然后通過數(shù)組循環(huán),使用 getName() 和 getValue() 方法來訪問每個 cookie 和相關(guān)的值。

示例

讓我們讀取之前例子中設(shè)置的 cookies:

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

現(xiàn)在讓我們將上面的代碼放在 main.jsp 文件中并試圖訪問它。如果你要設(shè)置 first_name cookie為“John”,last_name cookie 為“Player”,然后運行 http:// localhost:8080/main.jsp,將顯示下面的結(jié)果:

Found Cookies Name and Value

Name : first_name, Value: John

Name : last_name, Value: Player

用 JSP 刪除 Cookies

刪除 cookies 非常簡單。如果你想刪除一個 cookie,那么你只需要按照以下三步來處理:

  • 讀取一個已經(jīng)存在的 cookie 并把它保存在 Cookie 對象中。

  • 使用 setMaxAge() 方法將 cookie 的持續(xù)時間設(shè)置為 0 來刪除一個已經(jīng)存在的 cookie。

  • 將這個 cookie 添加到響應(yīng)標(biāo)題中。

示例

以下的例子中刪除了現(xiàn)存的命名為“first_name”的 cookie,當(dāng)你下次運行 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>

現(xiàn)在將上述代碼添加到 main.jsp 中并嘗試訪問它。它會出現(xiàn)如下所示的結(jié)果:

Cookies Name and Value

Deleted cookie : first_name

Name : first_name, Value: John

Name : last_name, Value: Player

現(xiàn)在嘗試再次運行 http://localhost:8080/main.jsp,只會出現(xiàn)如下所示的一個 cookie:

Found Cookies Name and Value

Name : last_name, Value: Player

你可以在 IE 瀏覽器中自動的刪除你的 cookies。單擊工具菜單并選擇網(wǎng)絡(luò)選項。要刪除所有 cookie,按下 Delete Cookies。