位置:首页 > > JSP Cookies处理

JSP Cookies处理

Cookie是存储在客户端计算机上的文本文件,它们保存为各种信息跟踪的目的。 JSP中使用透明底层的servlet技术支持HTTP Cookie。

有参与确定返回用户的三个步骤:

  • 服务器脚本发送一组cookies给浏览器。例如姓名,年龄,或标识号等等。

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

  • 当下次浏览器发送任何请求的Web服务器,然后发送这些Cookie的信息到服务器,服务器将使用这些信息来识别用户,也可以是用于其他目的也是如此。

本章将教你如何设置或重置的cookies,如何访问它们,以及如何使用JSP程序来删除它们。

Cookie剖析:

这时候,Cookies通常在HTTP头设置(虽然JavaScript的也可以直接在浏览器上设置cookie)。一个JSP,设置一个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=yiibai.com
Connection: close
Content-Type: text/html

正如你所看到的,Set-Cookie头包含一个名称值对,一个GMT日期,路径和域。名称和值将URL编码。该过期字段是一个指令给浏览器的给定时间和日期后,会“忘记”这个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

JSP脚本将通过请求方法request.getCookies(),它返回一个Cookie对象的数组访问的cookies。

Servlet Cookies 方法:

以下是与Cookie对象相关联的有用的方法,你可以使用,在JSP操作Cookie的列表:

S.N. 方法 & 描述
1 public void setDomain(String pattern)
This method sets the domain to which cookie applies, for example yiibai.com.
2 public String getDomain()
This method gets the domain to which cookie applies, for example yiibai.com.
3 public void setMaxAge(int expiry)
This method sets how much time (in seconds) should elapse before the cookie expires. If you don't set this, the cookie will last only for the current session.
4 public int getMaxAge()
This method returns the maximum age of the cookie, specified in seconds, By default, -1 indicating the cookie will persist until browser shutdown.
5 public String getName()
This method returns the name of the cookie. The name cannot be changed after creation.
6 public void setValue(String newValue)
This method sets the value associated with the cookie.
7 public String getValue()
This method gets the value associated with the cookie.
8 public void setPath(String uri)
This method sets the path to which this cookie applies. If you don't specify a path, the cookie is returned for all URLs in the same directory as the current page as well as all subdirectories.
9 public String getPath()
This method gets the path to which this cookie applies.
10 public void setSecure(boolean flag)
This method sets the boolean value indicating whether the cookie should only be sent over encrypted (i.e. SSL) connections.
11 public void setComment(String purpose)
This method specifies a comment that describes a cookie's purpose. The comment is useful if the browser presents the cookie to the user.
12 public String getComment()
This method returns the comment describing the purpose of this cookie, or null if the cookie has no comment.

使用JSP设置cookie:

设置cookie使用JSP包含三个步骤:

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

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

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

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

(2) 设置最长期限: 使用setMaxAge到指定cookie应该多长时间(以秒计)是有效的。下面将设立cookie为24小时。

cookie.setMaxAge(60*60*24); 

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

response.addCookie(cookie);

示例:

让我们修改我们的表单示例设置的cookie的名字和姓氏。

<%
   // 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 );
%>
<html>
<head>
<title>Setting Cookies</title>
</head>
<body>
<center>
<h1>Setting Cookies</h1>
</center>
<ul>
<li><p><b>First Name:</b>
   <%= request.getParameter("first_name")%>
</p></li>
<li><p><b>Last  Name:</b>
   <%= request.getParameter("last_name")%>
</p></li>
</ul>
</body>
</html>

让我们把上面的代码中main.jsp文件,然后使用下面的HTML页面:

<html>
<body>
<form action="main.jsp" 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.jsp并把hello.jsp和main.jsp 在 <Tomcat-installation-directory>/webapps/ ROOT目录。当您访问http://localhost:8080/hello.jsp,这里是上述表单的实际输出。

First Name:  
Last Name:   

尝试输入First Name和Last Name,然后单击提交按钮。这将显示姓氏和名字在屏幕上,并同时将设置两个cookie firstName和lastName这将被传递回时,下一次你按提交按钮提交到服务器。

下一节将说明如何访问这些Cookie的备份在Web应用程序。

使用JSP读取Cookie:

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

例子:

让我们读取在前面的例子中已经设置的Cookie:

<html>
<head>
<title>Reading Cookies</title>
</head>
<body>
<center>
<h1>Reading Cookies</h1>
</center>
<%
   Cookie cookie = null;
   Cookie[] cookies = null;
   // Get an array of Cookies associated with this domain
   cookies = request.getCookies();
   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>");
  }
%>
</body>
</html>

现在,让我们把上面的代码中main.jsp文件,然后尝试访问它。如果您想设置的cookie first_name 为“约翰”和last_name cookie为“Player”,然后运行http://localhost:8080/main.jsp会显示以下结果:

Found Cookies Name and Value

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

用JSP删除Cookies:

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

  • 读一个已经存在的Cookie,并将其存储在Cookie对象。

  • 使用的setMaxAge()方法来删除现有的cookie设置cookie的年龄为零。

  • 加入这个cookie返回到响应头。

例子:

下面的例子将删除并命名为“first_name”,当您将运行main.jsp的JSP下次现有的Cookie,将返回first_name的值为null。

<html>
<head>
<title>Reading Cookies</title>
</head>
<body>
<center>
<h1>Reading Cookies</h1>
</center>
<%
   Cookie cookie = null;
   Cookie[] cookies = null;
   // Get an array of Cookies associated with this domain
   cookies = request.getCookies();
   if( cookies != null ){
      out.println("<h2> Found 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>");
  }
%>
</body>
</html>

现在,让我们把上面的代码中main.jsp文件,然后尝试访问它。它会显示以下结果:

Cookies Name and Value

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

现在尝试运行http://localhost:8080/main.jsp,它应该如下所示只显示一个cookie:

Found Cookies Name and Value

Name : last_name, Value: Player

您可以手动删除Cookie在Internet Explorer。开始在工具菜单并选择Internet选项。要删除所有Cookie,请按删除Cookies。