Servlet程序应用和实例之使用Cookie呢,我们首先来看看Cookie,Cookie是一小块可以嵌入HTTP请求和响应的数据。它在服务器上产生,并作为响应头域的一部分返回给客户。浏览器在收到有Cookie的响应后,会把Cookie的内容以"关键字/值"的形式写入到一个专为存放Cookie的文本文件中。浏览器会把Cookie的信息与请求发送给服务器,这样服务器就可以再次读取Cookie中存放的数据了。Cookie可以对有效期进行设置,浏览器不会把过期的Cookie发送给服务器。
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() 返回当前对象的一个拷贝
- getComment() 返回描述该Cookie的注释,没有就为空
- getDomain() 返回该Cookie的域名
- getMaxAge() 返回该Cookie的最大寿命
- getName() 返回该Cookie的名字
- getPath() 返回使用该Cookie的所有URL前缀
- getSecure() 返回该Cookie的安全标志
- getValue() 返回该Cookie的值
- getVersion() 返回该Cookie的版本
- setComment(String) 设置描述该Cookie的注释
- setDomain(String) 设置该Cookie的域名
- setMaxAge(int) 设置该Cookie的最大寿命
- setPath(String) 设置该Cookie只能被从使用该URL前缀的请求提出
- setSecure(boolean) 设置该Cookie的安全标志
- setValue(String) 设置该Cookie的值
- setVersion(int) 设置该Cookie所使用的协议的版本号
实例:使用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("htmlhead/n" +
- "title阅微草堂/title/n" +
- "/head/n" +
- "bodypfont color=red" +
- "centerh3阅微草堂/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)
- + "秒钟内第 " + thisCookie.getValue() + " 次光临寒舍!/p");
- }
- else {
- out.println( "p您至少已经10秒钟没有光临寒舍了!/p");
- }
- out.println("/body/html");
- }
- }
相应的配置文件web.xml的内容如下:
- ?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-nameCookieCounter/servlet-name
- servlet-classtest.cookie.CookieCounter/servlet-class
- /servlet
- servlet-mapping
- servlet-nameCookieCounter/servlet-name
- url-pattern/CookieCounter/url-pattern
- /servlet-mapping
- /web-app
【程序注解】
本例是在Resin 2.1.8服务器下调试运行的。首先在webapps目录下建一个名为cookie的Web应用。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()函数获得客户端的Cookies,查找是否有名为"CookieCount"的Cookie。如果不存在就生成一个Cookie,名称为"CookieCount",值为"1"(thisCookie = new Cookie("CookieCount", "1")),并指定了该Cookie的最大寿命为10秒钟(setMaxAge(10)),然后将该Cookie发送给客户端(addCookie())。如果Cookie已经存在,就将Cookie的值加1之后再发送给客户端。
这样,如果客户端第一次访问CookieCounter Servlet,或者两次访问之间的时间间隔超过了10秒,就将看到如图14-8(a)所示的输出结果。如果客户端在Cookie的生命周期结束之前连续访问该Servlet,则Cookie的值将不断增加。如图14-8(b)所示的就是在10秒钟内连续访问两次Servlet时的输出结果。
Servlet程序应用和实例之使用Cookie的基本情况就是这样了,希望对你在实际操作有所帮助。