Cookie是一小塊可以嵌入HTTP請(qǐng)求和響應(yīng)的數(shù)據(jù)。它在服務(wù)器上產(chǎn)生,并作為響應(yīng)頭域的一部分返回給客戶。瀏覽器在收到有Cookie的響應(yīng)后,會(huì)把Cookie的內(nèi)容以"關(guān)鍵字/值"的形式寫(xiě)入到一個(gè)專為存放Cookie的文本文件中。瀏覽器會(huì)把Cookie的信息與請(qǐng)求發(fā)送給服務(wù)器,這樣服務(wù)器就可以再次讀取Cookie中存放的數(shù)據(jù)了。Cookie可以對(duì)有效期進(jìn)行設(shè)置,瀏覽器不會(huì)把過(guò)期的Cookie發(fā)送給服務(wù)器。
??? Servlet API提供了一個(gè)Cookie類,封裝了對(duì)Cookie的基本操作。如下所示。
java.lang.Object
??????????????????????????? |-javax.servlet.http.Cookie
public class Cookie extends Object implements Cloneable
???? Cookie類的方法如表14-4所示。
表14-4? Cookie類的方法
方??? 法????????????????? ?意??? 義
Cookie(String, String) 生成一個(gè)有名和值的Cookie
clone()??????????????? 返回當(dāng)前對(duì)象的一個(gè)拷貝
getComment()??????? 返回描述該Cookie的注釋,沒(méi)有就為空
getDomain()??????????? 返回該Cookie的域名
getMaxAge()??????????? 返回該Cookie的最大壽命
getName()??????????? 返回該Cookie的名字
getPath()??????????? 返回使用該Cookie的所有URL前綴
getSecure()??????????? 返回該Cookie的安全標(biāo)志
getValue()??????????? 返回該Cookie的值
getVersion()??????? 返回該Cookie的版本
setComment(String)??? 設(shè)置描述該Cookie的注釋
setDomain(String)??? 設(shè)置該Cookie的域名
setMaxAge(int)??????? 設(shè)置該Cookie的最大壽命
setPath(String)?設(shè)置該Cookie只能被從使用該URL前綴的請(qǐng)求提出
setSecure(boolean)?? 設(shè)置該Cookie的安全標(biāo)志
setValue(String)?? 設(shè)置該Cookie的值
setVersion(int)?????? 設(shè)置該Cookie所使用的協(xié)議的版本號(hào)
???? 實(shí)例:使用Cookie的Servlet程序
??? 下面的程序示例14-6就是對(duì)Cookie的基本運(yùn)用。
??? 【程序源代碼】
1?// ==================== Program Description ======================
2?// 程序名稱:示例14-6: CookieCounter.java
3?// 程序目的:編寫(xiě)Cookie的Servlet程序
4?// ==========================================================
5?package test.cookie;
6?
7?import java.io.*;
8?import java.util.*;
9?import javax.servlet.*;
10?import javax.servlet.http.*;
11?
12?public class CookieCounter extends HttpServlet {
?? public void init(ServletConfig config) throws ServletException {
14?????? super.init(config);
15??? }
16?
?? public void service(HttpServletRequest request,
?? HttpServletResponse response) throws
18??????? IOException {
????? boolean cookieFound = false;
20?????? Cookie thisCookie = null;
21?????? response.setContentType("text/html;charset=gb2312;");
22?????? PrintWriter out = response.getWriter();
23?
24?????? Cookie[] cookies = request.getCookies();
25?????? if (cookies != null){
26????????? for (int i = 0; i < cookies.length; i++) {
27???????????? thisCookie = cookies[0];
??????????? if (thisCookie.getName().equals("CookieCount")) {
29??????????????? cookieFound = true;
30??????????????? break;
31???????????? }
32????????? }
33?????? }
34?
35?????? if (cookieFound == false) {
36????????? thisCookie = new Cookie("CookieCount", "1");
37????????? thisCookie.setMaxAge(10);
38????????? response.addCookie(thisCookie);
39?????? }
40?
41?????? out.println(" " +
42?????????????????? " " +
43?????????????????? " " +
44?????????????????? "
" +
45?????????????????? "
閱微草堂
");
46?????? out.println("
歡迎來(lái)到閱微草堂!
");
47?
48?????? if (cookieFound) {
49????????? int cookieCount = Integer.parseInt(thisCookie.getValue());
50????????? cookieCount++;
51????????? thisCookie.setValue(String.valueOf(cookieCount));
52????????? thisCookie.setMaxAge(10);
53????????? response.addCookie(thisCookie);
54?
55????????? out.println("
這是您在近" + 10 *
(Integer.parseInt((thisCookie.getValue()))-1)
56??????????????????? + "秒鐘內(nèi)第 " + thisCookie.getValue() + " 次光臨寒舍!
");
57?????? }
58?????? else {
59????????? out.println( "
您至少已經(jīng)10秒鐘沒(méi)有光臨寒舍了!
");
60?????? }
61?????? out.println("");
62??? }
63?}
??? 相應(yīng)的配置文件web.xml的內(nèi)容如下:
?
??? CookieCounter
??? test.cookie.CookieCounter
?
?
??? CookieCounter
??? /CookieCounter
?
??? 【程序輸出結(jié)果】如圖14-8所示。
(a)
(b)
圖14-8 客戶端返回有關(guān)Cookie的信息
??? 【程序注解】
??? 本例是在Resin 2.1.8服務(wù)器下調(diào)試運(yùn)行的。首先在webapps目錄下建一個(gè)名為cookie的Web應(yīng)用。Servlet編譯生成的class文件放在cookie/WEB-INF/classes/test/cookie目錄下,web.xml文件直接放在cookie/WEB-INF目錄下。由于web.xml中url-pattern的配置為"/CookieCounter",所以在瀏覽器中輸入"http://localhost:8080/cookie/CookieCounter"即可訪問(wèn)到該Servlet。
??? 下面對(duì)源程序做一簡(jiǎn)單分析。在service()方法中,用getCookies()函數(shù)獲得客戶端的Cookies,查找是否有名為"CookieCount"的Cookie。如果不存在就生成一個(gè)Cookie,名稱為"CookieCount",值為"1"(thisCookie = new Cookie("CookieCount", "1")),并指定了該Cookie的最大壽命為10秒鐘(setMaxAge(10)),然后將該Cookie發(fā)送給客戶端(addCookie())。如果Cookie已經(jīng)存在,就將Cookie的值加1之后再發(fā)送給客戶端。
??? 這樣,如果客戶端第一次訪問(wèn)CookieCounter Servlet,或者兩次訪問(wèn)之間的時(shí)間間隔超過(guò)了10秒,就將看到如圖14-8(a)所示的輸出結(jié)果。如果客戶端在Cookie的生命周期結(jié)束之前連續(xù)訪問(wèn)該Servlet,則Cookie的值將不斷增加。如圖14-8(b)所示的就是在10秒鐘內(nèi)連續(xù)訪問(wèn)兩次Servlet時(shí)的輸出結(jié)果。
from:
http://www.jspcn.net/htmlnews/11242052102341354.html