当前位置:首页 » Servlets » Servlet Cookies处理

Servlet Cookies处理

Servlets Cookies处理实例代码 - Cookie是存储在客户端计算机上的文本文件,并保留了它们的各种信息跟踪的目的。 Java Servlet透明支持HTTP Cookie。

Cookie是存储在客户端计算机上的文本文件,并保留了它们的各种信息跟踪的目的。 Java Servlet透明支持HTTP Cookie。

涉及标识返回用户有三个步骤:

  • 服务器脚本发送到浏览器的一组cookie。对于如: 姓名,年龄,或识别号码等。

  • 浏览器将这些信息存储在本地计算机上,以备将来使用。

  • 下一次浏览器发送任何请求,Web服务器,然后这些cookie发送信息到服务器,服务器将使用这些信息来识别用户。

本章将教你如何设置或重置cookie,如何访问它们,以及如何将它们删除。

Cookie 剖析:

Cookies通常设置在HTTP头(虽然JavaScript也可以直接在浏览器上设置一个cookie)。servlet也可以设置一个cookie发送标头,看起来像这样:

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头包含一个名称值对,时间日期,路径和域。将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就能够访问的cookie通过请求方法request.getCookies()返回一个Cookie对象数组。

Servlet Cookies 方法:

以下是有用的方法列表时,可以使用servlet操纵cookies。

S.N. Method & Description
1 public void setDomain(String pattern)
这个方法设置域的cookie适用,例如www.gitbook.net
2 public String getDomain()
此方法获取域的cookie应用,例如gitbook.net
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用途或者为null,如果cookie没有注释。

使用Servlet设置Cookie:

设置Cookie的servlet包括三个步骤:

(1) 创建一个Cookie对象:cookie的名称和cookie的值,这两个都是字符串调用Cookie的构造函数。

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

请记住,无论是名字,也不值应该包含空格或以下任何字符:

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

(2) 设置将最长生存期:可以使用setMaxAge方法到指定多长时间(以秒为单位),在这时间内cookie应该是有效的。以下将成立一个24小时的cookie。

cookie.setMaxAge(60*60*24); 

(3) HTTP响应头的Cookie发送到:使用response.addCookie添加cookie的HTTP响应头如下:

response.addCookie(cookie);

例子:

让我们修改我们的表格示例,设置第一个和最后一个名字的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>

保存上述文件为hello.htm,并把它放在<Tomcat-installation-directory>/webapps/ROOT/目录中HTML内容。

尝试输入First Name和Last Name,然后单击“提交”按钮。这将显示在屏幕上,同时设置两个cookie将被传递回服务器,您需要按“提交”按钮时,下一次的firstName和lastName姓氏和名字。
下一节会解释,如何在Web应用程序中访问这些Cookie的备份。


使用Servlet读取Cookie:

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

例子:

让我们读取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为“John”和last_name的“Player”的cookie的cookie,然后运行http://localhost:8080/ReadCookies将显示以下结果:

Found Cookies Name and Value

Name : first_name, Value: John 
Name : last_name, Value: Player

使用Servlet删除Cookies:

删除cookie是非常简单的。如果你想删除一个cookie,那么你只需要遵循以下三个步骤:

  1. 阅读一个已经存在的cookie,并将其存储在Cookie对象。

  2. 设置cookie的年龄为零,通过setMaxAge()方法来删除现有的cookie。

  3. 将这个Cookie添加到响应头。

例子:

下面的例子将删除现有的cookie名为“first_name”,当你将运行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 -by www.gitbook.net
      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>");
   }
}

编译以上DeleteCookies 配置servlet ,并在web.xml文件中创建相应的条目。

现在运行http://localhost:8080/DeleteCookies将显示如下的结果:

Cookies Name and Value

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

现在尝试运行http://localhost:8080/ReadCookies ,它会显示一个cookie如下:

Found Cookies Name and Value

Name : last_name, Value: Player

您可以手动在Internet Explorer中删除Cookie。在“工具”菜单,选择“Internet选项”。要删除所有Cookie,按“删除Cookies”。