Servlets 简明教程

Servlets - Cookies Handling

Cookie 是存储在客户端计算机上的文本文件,用于跟踪各种信息。Java Servlet 透明地支持 HTTP Cookie。

识别返回用户涉及三个步骤 −

  1. 服务器脚本将一组 Cookie 发送到浏览器。例如,姓名、年龄或身份证号等。

  2. 浏览器在本地计算机上存储此信息以供将来使用。

  3. 当浏览器下次向 Web 服务器发送任何请求时,它会将那些 Cookie 信息发送到服务器,服务器使用该信息来识别用户。

本章将教您如何设置或重置 Cookie、如何访问它们以及如何删除它们。

Cookie 通常设置在 HTTP 标头中(尽管 JavaScript 也可以在浏览器上直接设置 Cookie)。设置 Cookie 的 servlet 可能会发送类似以下内容的标头 −

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 标头包含一个名称值对、一个 GMT 日期、一个路径和一个域名。名称和值将经过 URL 编码。expires 字段是指示浏览器在给定时间和日期后“忘记”Cookie 的指令。

如果浏览器配置为存储 Cookie,它将保留此信息,直至过期日期。如果用户在任何匹配该 Cookie 的路径和域名的页面上指向浏览器,它将向服务器重新发送该 Cookie。浏览器的标头可能看起来像 −

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

然后 Servlet 可以通过请求方法 request.getCookies() 访问该 Cookie,这会返回 Cookie 对象的数组。

Servlet Cookies Methods

以下是可以在 Servlet 中操作 Cookie 时使用的有用方法列表。

Sr.No.

Method & Description

1

*public void setDomain(String pattern) *此方法设置 cookie 适用的域名,例如 tutorialspoint.com。

2

*public String getDomain() *此方法获取 cookie 适用的域名,例如 tutorialspoint.com。

3

public void setMaxAge(int expiry) 此方法设置 Cookie 失效之前应经过多长时间(以秒为单位)。如果你不设置此项,该 Cookie 只会在当前会话中生效。

4

public int getMaxAge() 此方法返回 Cookie 的最大生存期,以秒为单位。默认情况下,-1 表示 Cookie 将持续存在,直至浏览器关闭。

5

public String getName() 此方法返回 Cookie 的名称。名称在创建后不可更改。

6

*public void setValue(String newValue) *此方法设置与 Cookie 关联的值

7

*public String getValue() *此方法获取与 Cookie 关联的值。

8

*public void setPath(String uri) *此方法设置此 Cookie 适用的路径。如果你未指定路径,该 Cookie 会返回与当前页面同目录中所有 URL 以及所有子目录。

9

public String getPath() 此方法获取此 Cookie 适用的路径。

10

public void setSecure(boolean flag) 此方法设置布尔值,表明 Cookie 是否仅通过加密(即 SSL)连接发送。

11

*public void setComment(String purpose) *此方法指定描述 Cookie 目的的注释。如果浏览器向用户展示 Cookie,则该注释很有用。

12

public String getComment() 此方法返回描述此 Cookie 目的的注释,如果 Cookie 没有注释,则返回 null。

Setting Cookies with Servlet

通过 Servlet 设置 Cookie 涉及三个步骤 −

(1) Creating a Cookie object − 使用 Cookie 名称和 Cookie 值调用 Cookie 构造函数,两者均为字符串。

Cookie cookie = new Cookie("key","value");

记住,名称或值都不应包含空格或以下任何字符 −

[ ] ( ) = , " / ? @ : ;

(2) Setting the maximum age − 使用 setMaxAge 指定 Cookie 应有效多长时间(以秒为单位)。以下将设置一个 24 小时的 Cookie。

cookie.setMaxAge(60 * 60 * 24);

(3) Sending the Cookie into the HTTP response headers − 您使用 response.addCookie 在 HTTP 响应头中添加 cookie,如下所示:

response.addCookie(cookie);

Example

我们修改我们的 Form Example 以设置 first 和 last name 的 cookie。

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

// Extend HttpServlet class
public class HelloForm extends HttpServlet {

   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

      // 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 );

      // Set response content type
      response.setContentType("text/html");

      PrintWriter out = response.getWriter();
      String title = "Setting 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" +
               "<h1 align = \"center\">" + title + "</h1>\n" +
               "<ul>\n" +
                  "  <li><b>First Name</b>: "
                  + request.getParameter("first_name") + "\n" +
                  "  <li><b>Last Name</b>: "
                  + request.getParameter("last_name") + "\n" +
               "</ul>\n" +
            "</body>
         </html>"
      );
   }
}

编译上面的 servlet HelloForm 并创建 web.xml 文件中的相应条目,最后尝试以下 HTML 页面以调用 servlet。

<html>
   <body>
      <form action = "HelloForm" 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 内容保留在 Hello.htm 文件中,并将其放到 <Tomcat 安装目录>/webapps/ROOT 目录中。在您访问时 [role="bare"] [role="bare"]http://localhost:8080/Hello.htm ,以下是上面表单的实际输出。

尝试输入 First Name 和 Last Name,然后点击提交按钮。将显示您的屏幕上的 first name 和 last name,同时将设置两个 cookies(firstName 和 lastName),下次按下提交按钮时将传回服务器。

下一部分将向您解释如何在 Web 应用程序中访问这些 cookie。

Reading Cookies with Servlet

要读取 cookie,需要通过调用 HttpServletRequest 的 getCookies() 方法,创建一个 javax.servlet.http.Cookie 对象的数组。然后循环数组,并使用 getName() 和 getValue() 方法来访问每个 cookie 和关联的值。

Example

我们读取在先前示例中设置的 cookie −

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

// Extend HttpServlet class
public class ReadCookies extends HttpServlet {

   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

      Cookie cookie = null;
      Cookie[] cookies = null;

      // Get an array of Cookies associated with this domain
      cookies = request.getCookies();

      // Set response content type
      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> 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>");
      }
      out.println("</body>");
      out.println("</html>");
   }
}

编译上面 servlet ReadCookies 并创建 web.xml 文件中的相应条目。如果您将 first_name cookie 设置为“John”,将 last_name cookie 设置为“Player”,则运行 [role="bare"] [role="bare"]http://localhost:8080/ReadCookies 将显示以下结果 −

 Found Cookies Name and Value
Name : first_name, Value: John
Name : last_name,  Value: Player

Delete Cookies with Servlet

删除 cookie 非常简单。如果您希望删除 cookie,只需按照以下三个步骤操作:

  1. 读取已存在的 cookie 并将其存储到 Cookie 对象中。

  2. 使用 setMaxAge() 方法将 cookie age 设置为 0,以删除现有 cookie

  3. 将此 cookie 添加回响应头中。

Example

以下示例将删除名为“first_name”的现有 cookie,当您下次运行 ReadCookies servlet 时,它将为 first_name 返回空值。

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

// Extend HttpServlet class
public class DeleteCookies extends HttpServlet {

   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

      Cookie cookie = null;
      Cookie[] cookies = null;

      // Get an array of Cookies associated with this domain
      cookies = request.getCookies();

      // Set response content type
      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 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>");
      }
      out.println("</body>");
      out.println("</html>");
   }
}

编译上面 servlet DeleteCookies 并创建 web.xml 文件中的相应条目。现在,运行 [role="bare"] [role="bare"]http://localhost:8080/DeleteCookies 将显示以下结果 −

Cookies Name and Value
Deleted cookie : first_name
Name : first_name, Value: John
Name : last_name,  Value: Player

现在,尝试运行 [role="bare"] [role="bare"]http://localhost:8080/ReadCookies ,它将只显示一个如下所示的 cookie −

 Found Cookies Name and Value
Name : last_name,  Value: Player

您可以在 Internet Explorer 中手动删除 cookie。从工具菜单开始,然后选择 Internet 选项。要删除所有 cookie,请按删除 Cookies。