Servlet程序應(yīng)用和實例之使用Cookie簡析
Servlet程序應(yīng)用和實例之使用Cookie呢,我們首先來看看Cookie,Cookie是一小塊可以嵌入HTTP請求和響應(yīng)的數(shù)據(jù)。它在服務(wù)器上產(chǎn)生,并作為響應(yīng)頭域的一部分返回給客戶。瀏覽器在收到有Cookie的響應(yīng)后,會把Cookie的內(nèi)容以"關(guān)鍵字/值"的形式寫入到一個專為存放Cookie的文本文件中。瀏覽器會把Cookie的信息與請求發(fā)送給服務(wù)器,這樣服務(wù)器就可以再次讀取Cookie中存放的數(shù)據(jù)了。Cookie可以對有效期進行設(shè)置,瀏覽器不會把過期的Cookie發(fā)送給服務(wù)器。
Servlet API提供了一個Cookie類,封裝了對Cookie的基本操作。如下所示。
java.lang.Object.javax.servlet.http.Cookie
public class Cookie extends Object implements Cloneable
Cookie類的方法如表1所示。
- 表 1 Cookie類的方法
- 方 法 意 義
- Cookie(String, String) 生成一個有名和值的Cookie
- clone() 返回當(dāng)前對象的一個拷貝
- getComment() 返回描述該Cookie的注釋,沒有就為空
- 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前綴的請求提出
- setSecure(boolean) 設(shè)置該Cookie的安全標(biāo)志
- setValue(String) 設(shè)置該Cookie的值
- setVersion(int) 設(shè)置該Cookie所使用的協(xié)議的版本號
實例:使用Cookie的Servlet程序
下面的程序示例14-6就是對Cookie的基本運用。
【程序源代碼】
- // ==================== Program Description ======================
- // 程序名稱:示例14-6: CookieCounter.java
- // 程序目的:編寫Cookie的Servlet程序
- // ==========================================================
- package test.cookie;
- import java.io.*;
- import java.util.*;
- import javax.servlet.*;
- import javax.servlet.http.*;
- public class CookieCounter extends HttpServlet {
- public void init(ServletConfig config) throws ServletException {
- super.init(config);
- }
- public void service(HttpServletRequest request,
- HttpServletResponse response) throws
- IOException {
- boolean cookieFound = false;
- Cookie thisCookie = null;
- response.setContentType("text/html;charset=gb2312;");
- PrintWriter out = response.getWriter();
- Cookie[] cookies = request.getCookies();
- if (cookies != null){
- for (int i = 0; i ﹤ cookies.length; i++) {
- thisCookie = cookies[0];
- if (thisCookie.getName().equals("CookieCount")) {
- cookieFound = true;
- break;
- }
- }
- }
- if (cookieFound == false) {
- thisCookie = new Cookie("CookieCount", "1");
- thisCookie.setMaxAge(10);
- response.addCookie(thisCookie);
- }
- out.println("﹤html﹥﹤head﹥\n" +
- "﹤title﹥閱微草堂﹤/title﹥\n" +
- "﹤/head﹥\n" +
- "﹤body﹥﹤p﹥﹤font color=red﹥" +
- "﹤center﹥﹤h3﹥閱微草堂﹤/h3﹥﹤/center﹥﹤/font﹥");
- out.println("﹤p﹥歡迎來到閱微草堂!﹤/p﹥");
- if (cookieFound) {
- int cookieCount = Integer.parseInt(thisCookie.getValue());
- cookieCount++;
- thisCookie.setValue(String.valueOf(cookieCount));
- thisCookie.setMaxAge(10);
- response.addCookie(thisCookie);
- out.println("﹤p﹥這是您在近" + 10 *
- (Integer.parseInt((thisCookie.getValue()))-1)
- + "秒鐘內(nèi)第 " + thisCookie.getValue() + " 次光臨寒舍!﹤/p﹥");
- }
- else {
- out.println( "﹤p﹥您至少已經(jīng)10秒鐘沒有光臨寒舍了!﹤/p﹥");
- }
- out.println("﹤/body﹥﹤/html﹥");
- }
- }
相應(yīng)的配置文件web.xml的內(nèi)容如下:
- ﹤?xml version="1.0" encoding="UTF-8"?﹥
- ﹤!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//
- DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"﹥
- ﹤web-app﹥
- ﹤servlet﹥
- ﹤servlet-name﹥CookieCounter﹤/servlet-name﹥
- ﹤servlet-class﹥test.cookie.CookieCounter﹤/servlet-class﹥
- ﹤/servlet﹥
- ﹤servlet-mapping﹥
- ﹤servlet-name﹥CookieCounter﹤/servlet-name﹥
- ﹤url-pattern﹥/CookieCounter﹤/url-pattern﹥
- ﹤/servlet-mapping﹥
- ﹤/web-app﹥
【程序注解】
本例是在Resin 2.1.8服務(wù)器下調(diào)試運行的。首先在webapps目錄下建一個名為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"即可訪問到該Servlet。
下面對源程序做一簡單分析。在service()方法中,用getCookies()函數(shù)獲得客戶端的Cookies,查找是否有名為"CookieCount"的Cookie。如果不存在就生成一個Cookie,名稱為"CookieCount",值為"1"(thisCookie = new Cookie("CookieCount", "1")),并指定了該Cookie的最大壽命為10秒鐘(setMaxAge(10)),然后將該Cookie發(fā)送給客戶端(addCookie())。如果Cookie已經(jīng)存在,就將Cookie的值加1之后再發(fā)送給客戶端。
這樣,如果客戶端第一次訪問CookieCounter Servlet,或者兩次訪問之間的時間間隔超過了10秒,就將看到如圖14-8(a)所示的輸出結(jié)果。如果客戶端在Cookie的生命周期結(jié)束之前連續(xù)訪問該Servlet,則Cookie的值將不斷增加。如圖14-8(b)所示的就是在10秒鐘內(nèi)連續(xù)訪問兩次Servlet時的輸出結(jié)果。
Servlet程序應(yīng)用和實例之使用Cookie的基本情況就是這樣了,希望對你在實際操作有所幫助。
【編輯推薦】