Servlet Cookies小结

1、Cookies简介

Cookies是存储在客户端计算机上的文本文件,并保留了各种跟踪信息。Java Servlet中Cookie的基本工作流程是:

(1)服务器向浏览器发送一组Cookies,比如:用户的姓名等等。

(2)浏览器将这些信息保存在本地计算机上。

(3)当下一次浏览器向Web服务器发送任何请求时,浏览器会把这些Cookies信息发送到服务器。

2、Servlet Cookies方法

下面是在Servlet中常用到的Cookies操作方法:

方法
描述
public void setDomain(String pattern)该方法设置cookie适用的域。
public String getDomain()该方法获取cookie适用的域。
public void setMaxAge(int expiry)该方法设置cookie过期的时间(以秒为单位)。如果不这样设置,cookie只会在当前session会话中持续有效。
public int getMaxAge()该方法返回cookie的最大生存周期(以秒为单位),默认情况下,-1 表示cookie将持续下去,直到浏览器关闭。
public String getName()该方法返回cookie的名称,名称在创建后不能改变。
public void setValue(String newValue)该方法设置与cookie关联的值。
public String getValue()该方法获取与cookie关联的值。
public void setPath(String uri)该方法设置cookie适用的路径。如果您不指定路径,与当前页面相同目录下的(包括子目录下的)所有URL都会返回cookie。
public String getPath()该方法获取cookie适用的路径。
public void setSecure(boolean flag)该方法设置布尔值,表示cookie是否应该只在加密的(即 SSL)连接上发送。
public void setComment(String purpose)该方法规定了描述cookie目的的注释。该注释在浏览器向用户呈现cookie时非常有用。
public String getComment()该方法返回了描述cookie目的的注释,如果 ookie没有注释则返回null。

3、Servlet中设置Cookies

直接看下面代码就OK了,代码摘自互联网。

package net.yedward.server;
//导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
//扩展 HttpServlet 类
public class HelloForm extends HttpServlet {
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  // 为名字和姓氏创建 Cookies
  Cookie firstName = new Cookie("first_name",
    request.getParameter("first_name"));
  Cookie lastName = new Cookie("last_name",
    request.getParameter("last_name"));
  // 为两个 Cookies 设置过期日期为 24 小时后
  firstName.setMaxAge(60 * 60 * 24);
  lastName.setMaxAge(60 * 60 * 24);
  // 在响应头中添加两个 Cookies
  response.addCookie(firstName);
  response.addCookie(lastName);
  // 设置响应内容类型
  response.setContentType("text/html");
  PrintWriter out = response.getWriter();
  String title = "设置 Cookies 实例";
  String docType = "<!doctype html public \"-//w3c//dtd html 4.0 "
    + "transitional//en\">\n";
  out.println(docType + "<html>\n" + "<head><title>" + title
    + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n"
    + "<h1 align=\"center\">" + title + "</h1>\n" + "<ul>\n"
    + "  <li><b>名字</b>:" + request.getParameter("first_name")
    + "\n" + "  <li><b>姓氏</b>:" + request.getParameter("last_name")
    + "\n" + "</ul>\n" + "</body></html>");
 }
}

创建一个cookie,基本上就那么几步:首先创建一个Cookie对象,然后设置一下cookie的一些属性,比如最大声明周期(以秒为单位)等等,再然后将cookie通过response.addCookie(cookie)方法发动到HTTP的响应头,在响应头中发送到浏览器。上面的那段代码只是Servlet的代码,至于jsp以及web.xml文件的配置,这里不写了。

4、Servlet中读取Cookies

读取cookie需要调用HttpServletRequest对象中的getCookies()方法创建一个Cookie对象数组,然后遍历该数组,使用getName()、getValue()方法获取即可,有关cookie的其他方法,可以参见本文上面的表。

package net.yedward.server;
//导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
//扩展 HttpServlet 类
public class ReadCookies extends HttpServlet {
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  Cookie cookie = null;
  Cookie[] cookies = null;
  // 获取与该域相关的 Cookies 的数组
  cookies = request.getCookies();
  // 设置响应内容类型
  response.setContentType("text/html");
  PrintWriter out = response.getWriter();
  String title = "Reading Cookies Example";
  String docType = "<!doctype html public \"-//w3c//dtd html 4.0 "
    + "transitional//en\">\n";
  out.println(docType + "<html>\n" + "<head><title>" + title
    + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n");
  if (cookies != null) {
   out.println("<h2>查找 Cookies 名称和值</h2>");
   for (int i = 0; i < cookies.length; i++) {
    cookie = cookies[i];
    out.print("名称:" + cookie.getName() + ",");
    out.print("值:" + cookie.getValue() + " <br/>");
   }
  } else {
   out.println("<h2 class='tutheader'>未找到 Cookies</h2>");
  }
  out.println("</body>");
  out.println("</html>");
 }
}

5、Servlet中删除Cookies

package net.yedward.server;
// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
// 扩展 HttpServlet 类
public class DeleteCookies extends HttpServlet {
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  Cookie cookie = null;
  Cookie[] cookies = null;
  // 获取与该域相关的 Cookies 的数组
  cookies = request.getCookies();
  // 设置响应内容类型
  response.setContentType("text/html");
  PrintWriter out = response.getWriter();
  String title = "Delete Cookies Example";
  String docType = "<!doctype html public \"-//w3c//dtd html 4.0 "
    + "transitional//en\">\n";
  out.println(docType + "<html>\n" + "<head><title>" + title
    + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n");
  if (cookies != null) {
   out.println("<h2>Cookies 名称和值</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("已删除的 cookie:" + cookie.getName() + "<br/>");
    }
    out.print("名称:" + cookie.getName() + ",");
    out.print("值:" + cookie.getValue() + " <br/>");
   }
  } else {
   out.println("<h2 class='tutheader'>No cookies founds</h2>");
  }
  out.println("</body>");
  out.println("</html>");
 }
}

删除一个cookie的步骤大概是:首先读取一个现有的cookie,并把它存储在Cookie对象中;然后使用setMaxAge()方法设置cookie的age为0;最后把这个cookie添加到响应头,发送到浏览器。

6、我的代码

上面的代码及内容都是总结自w3school菜鸟教程(真心想说这个网站真心好,里面的教程实在比大学里那些花钱买的教程好的太多),下面的代码是我自己写的一些,主要用于实现添加cookie、获取cookie、删除cookie。

结构图

图1:结构图

(1)index.jsp中的代码

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>index</title>
  </head>
  <body>
  <form action="cookie.do" method="post">
   <input type="text" name="username" />
   <input type="password" name="userpwd" />
   <input type="submit" value="submit" />
  </form>
  </body>
</html>

(2)CookieDemo.java中代码

package net.yedward.server;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CookieDemo extends HttpServlet {
 private static final long serialVersionUID = 808153761817611712L;
 @Override
 protected void service(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  String username = request.getParameter("username");
  String userpwd = request.getParameter("userpwd");
  Cookie cookieUserName = new Cookie("username", username);
  cookieUserName.setMaxAge(60 * 60 * 24 * 7);
  Cookie cookieUserPwd = new Cookie("userpwd", userpwd);
  cookieUserPwd.setMaxAge(60 * 60 * 24 * 7);
  response.addCookie(cookieUserName);
  response.addCookie(cookieUserPwd);
  request.getRequestDispatcher("welcome.do").forward(request, response);
 }
}

(3)Welcome.java中的代码

package net.yedward.server;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Welcome extends HttpServlet {
 private static final long serialVersionUID = -2437173630225628212L;
 @Override
 protected void service(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  response.setContentType("text/html; charset=utf-8");
  PrintWriter out = response.getWriter();
  Cookie[] cookies = request.getCookies();
  for (int i = 0; i < cookies.length; i++) {
   out.println(cookies[i].getName() + " " + cookies[i].getValue());
  }
  for (int i = 0; i < cookies.length; i++) {
   cookies[i].setMaxAge(0);
   response.addCookie(cookies[i]);
  }
  out.println("<br/>删除成功");
  out.flush();
  out.close();
 }
}

(4)web.xml中的代码

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
 xmlns="http://java.sun.com/xml/ns/javaee" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>
  <servlet>
    <servlet-name>CookieDemo</servlet-name>
    <servlet-class>net.yedward.server.CookieDemo</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>Welcome</servlet-name>
    <servlet-class>net.yedward.server.Welcome</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>CookieDemo</servlet-name>
    <url-pattern>/cookie.do</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>Welcome</servlet-name>
    <url-pattern>/welcome.do</url-pattern>
  </servlet-mapping> 
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

最后一个web.xml是配置文件。

本文标题:Servlet Cookies小结

本文链接:http://yedward.net/?id=267

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章