JSP - Cookie 处理


在本章中,我们将讨论 JSP 中的 Cookie 处理。Cookie 是存储在客户端计算机上的文本文件,保留它们用于各种信息跟踪目的。JSP 使用底层 servlet 技术透明地支持 HTTP cookie。

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

  • 服务器脚本向浏览器发送一组 cookie。例如,姓名、年龄或身份证号码等。

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

  • 当下次浏览器向 Web 服务器发送任何请求时,它会将这些 Cookie 信息发送到服务器,服务器使用该信息来识别用户或也可能用于其他目的。

本章将教您如何设置或重置cookie、如何访问它们以及如何使用JSP程序删除它们。

cookie的解剖

Cookie 通常设置在 HTTP 标头中(尽管 JavaScript 也可以直接在浏览器上设置 Cookie)。设置 cookie 的 JSP 可能会发送如下所示的标头 -

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 编码。过期字段指示浏览器在给定的时间和日期之后“忘记” 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 ,该方法返回Cookie对象数组。

Servlet Cookie 方法

下表列出了与 Cookie 对象关联的有用方法,您可以在 JSP 中操作 cookie 时使用这些方法 -

编号 方法及说明
1

公共无效setDomain(字符串模式)

该方法设置cookie适用的域;例如,tutorialspoint.com。

2

公共字符串 getDomain()

该方法获取cookie适用的域;例如,tutorialspoint.com。

3

公共无效setMaxAge(int到期)

此方法设置 cookie 过期之前应经过多长时间(以秒为单位)。如果您不设置此项,则 cookie 将仅在当前会话期间有效。

4

公共 int getMaxAge()

此方法返回 cookie 的最长期限,以秒为单位指定,默认情况下,-1表示 cookie 将持续存在,直到浏览器关闭。

5

公共字符串 getName()

该方法返回 cookie 的名称。创建后名称不能更改。

6

公共无效setValue(字符串newValue)

此方法设置与 cookie 关联的值。

7

公共字符串 getValue()

此方法获取与 cookie 关联的值。

8

公共无效setPath(字符串uri)

此方法设置此 cookie 应用的路径。如果不指定路径,则为当前页面所在目录以及所有子目录中的所有 URL 返回 cookie。

9

公共字符串 getPath()

此方法获取此 cookie 应用的路径。

10

公共无效setSecure(布尔标志)

此方法设置布尔值,指示 cookie 是否只应通过加密(即 SSL)连接发送。

11

公共无效setComment(字符串目的)

此方法指定描述 cookie 用途的注释。如果浏览器将 cookie 呈现给用户,则该注释很有用。

12

公共字符串 getComment()

此方法返回描述此 cookie 用途的注释,如果 cookie 没有注释,则返回 null。

使用 JSP 设置 Cookie

使用 JSP 设置 cookie 涉及三个步骤 -

第1步:创建Cookie对象

您可以使用 cookie 名称和 cookie 值(两者都是字符串)调用 Cookie 构造函数。

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

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

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

第 2 步:设置最大年龄

您可以使用setMaxAge来指定 cookie 的有效时间(以秒为单位)。以下代码将设置 24 小时的 cookie。

cookie.setMaxAge(60*60*24); 

步骤 3:将 Cookie 发送到 HTTP 响应标头中

您使用response.addCookie在HTTP响应标头中添加cookie,如下所示

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.jspmain.jsp放在<Tomcat-installation-directory>/webapps/ROOT目录中。当您访问http://localhost:8080/hello.jsp时,以下是上述表单的实际输出。

名:
姓:

尝试输入名字和姓氏,然后单击提交按钮。这将在屏幕上显示名字和姓氏,并且还会设置两个 cookie firstNamelastName。当您下次单击“提交”按钮时,这些 cookie 将被传回服务器。

在下一节中,我们将解释如何在您的 Web 应用程序中访问这些 cookie。

使用JSP读取Cookie

要读取 cookie,您需要通过调用HttpServletRequest的getCookies( )方法创建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 the 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文件中并尝试访问它。如果将first_name cookie设置为“John”,将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 删除 Cookie

删除cookies非常简单。如果您想删除 cookie,那么您只需遵循以下三个步骤 -

  • 读取已经存在的 cookie 并将其存储在 Cookie 对象中。

  • 使用setMaxAge()方法将 cookie 期限设置为零以删除现有 cookie。

  • 将此 cookie 添加回响应标头中。

例子

下面的示例将向您展示如何删除名为“first_name”的现有 cookie ,并且当您下次运行 main.jsp JSP 时,它将返回 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 the 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

您可以在 Internet Explorer 中手动删除 cookie。从“工具”菜单开始并选择“Internet 选项”。要删除所有 cookie,请单击删除 Cookie 按钮。