Cookies 是存儲在客戶端計算機的文本文件,保存各種跟蹤目標(biāo)的信息。JSP 使用底層 servlet 技術(shù)透明地支持 HTTP cookies。
確定返回用戶有三個步驟:
服務(wù)器腳本向瀏覽器發(fā)送的一系列cookies。例如姓名、年齡、身份證號碼等。
瀏覽器將這個信息存儲在本地機器上,以供將來使用。
本章將教你如何設(shè)置或重置 cookies,如何訪問它們,以及如何使用 JSP 程序刪除它們。
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
下面是與 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 包括三個步驟:
(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時,這是表單上的實際輸出。
嘗試輸入姓名,然后單擊 submit 按鈕。這將在你的屏幕上顯示姓名,同時會設(shè)置 firstName 和 lastName 這兩個 cookie,當(dāng)你下次點擊 submit 按鈕時,將傳回服務(wù)器。
下一節(jié)將解釋如何在你的web應(yīng)用程序中訪問這些 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
刪除 cookies 非常簡單。如果你想刪除一個 cookie,那么你只需要按照以下三步來處理:
讀取一個已經(jīng)存在的 cookie 并把它保存在 Cookie 對象中。
使用 setMaxAge() 方法將 cookie 的持續(xù)時間設(shè)置為 0 來刪除一個已經(jīng)存在的 cookie。
以下的例子中刪除了現(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。