橘子味的心
标题:JSP Cookies处理

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

识别和返回用户信息有三个步骤 -

  • 服务器脚本将一组Cookie发送到浏览器。例如姓名,年龄或身份证号等
  • 浏览器将此信息存储在本地机器上以备将来使用。
  • 当下一次浏览器向Web服务器发送任何请求时,浏览器将这些cookie信息发送到服务器,服务器使用该信息来识别用户,或者也可以用于其他目的。

本章将介绍如何设置或重置Cookie,如何访问它们以及如何使用JSP程序来删除它们。

Cookie通常设置在HTTP标头中(尽管JavaScript也可以直接在浏览器上设置cookie)。设置cookie的JSP响应头发送看起来类似这样 -

  1. HTTP/1.1 200 OK
  2. Date: Fri, 04 Feb 2000 21:03:38 GMT
  3. Server: Apache/1.3.9 (UNIX) PHP/4.0b3
  4. Set-Cookie: name = xyz; expires = Friday, 04-Feb-07 22:03:38 GMT;
  5. path = /; domain = yiibai.com
  6. Connection: close
  7. Content-Type: text/html
  8. Shell

可以看到,Set-Cookie头包含nameGMTpathdomain的键值对。名称和值将被URL编码。 expires字段是指定的时间和日期之后浏览器删除cookie的指令。

如果浏览器配置为存储cookie,那么它将保留此信息直到指定期日。如果用户将浏览器指向与Cookie的路径和域匹配的任何页面,则它将重新发送到服务器的cookie。浏览器的请求标头看起来像这样 -

  1. GET / HTTP/1.0
  2. Connection: Keep-Alive
  3. User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)
  4. Host: zink.demon.co.uk:1126
  5.  
  6. Accept: image/gif, */*
  7. Accept-Encoding: gzip
  8. Accept-Language: en
  9. Accept-Charset: iso-8859-1,*,utf-8
  10. Cookie: name = xyz
  11. Shell

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

下表列出了与Cookie对象相关联的有用方法,我们可以在JSP中操作Cookie时调用它们。

编号 方法 描述
1 public void setDomain(String pattern) 此方法设置适用Cookie的域; 例如,yiibai.com
2 public String getDomain() 此方法获取适用Cookie的域; 例如,yiibai.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适用的路径。如果不指定路径,则将返回与当前页面以及所有子目录位于同一目录中的所有URL的Cookie。
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

使用JSP设置Cookies

使用JSP设置cookie包括三个步骤 -

步骤1:创建一个Cookie对象

指定Cookie名称和Cookie值调用Cookie构造函数,这两者都是字符串。参考以下代码 -

  1. Cookie cookie = new Cookie("key","value");
  2. Java

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

  1. [ ] ( ) = , " / ? @ : ;
  2. Shell

步骤2:设置最大有效时间

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

  1. Cookie cookie = new Cookie("key","value");
  2. cookie.setMaxAge(60*60*24);
  3. Java

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

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

  1. Cookie cookie = new Cookie("key","value");
  2. cookie.setMaxAge(60*60*24);
  3. response.addCookie(cookie);
  4. Java

JSP操作Cookies示例

打开Eclipse,创建一个动态Web项目:CookiesHandling,其结构如下所示 -

假设要实现将用户提交上来的用户名和Email设置到cookie中,并返回到客户端浏览器。请参考以下代码 -

文件:setCookies.jsp -

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>接收表单并设置Cookies</title>
  8. </head>
  9. <body>
  10. <%
  11. // Create cookies for first and last names.
  12. Cookie cookie1 = new Cookie("username", request.getParameter("username"));
  13. Cookie cookie2 = new Cookie("email", request.getParameter("email"));
  14.  
  15. // Set expiry date after 24 Hrs for both the cookies.
  16. cookie1.setMaxAge(60 * 60 * 24);
  17. cookie2.setMaxAge(60 * 60 * 24);
  18.  
  19. // Add both the cookies in the response header.
  20. response.addCookie(cookie1);
  21. response.addCookie(cookie2);
  22. %>
  23. <div style="margin: auto; width: 80%;">
  24. <center>
  25. <h2>设置Cookies</h2>
  26. </center>
  27. <ul>
  28. <li><p>
  29. <b>用户名:</b>
  30. <%=request.getParameter("username")%>
  31. </p></li>
  32. <li><p>
  33. <b>Email:</b>
  34. <%=request.getParameter("email")%>
  35. </p></li>
  36. </ul>
  37. </div>
  38. </body>
  39. </html>
  40. HTML

创建另一个显示表单的HTML文件:form.jsp,其内容如下所示 -

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>用户表单</title>
  6. </head>
  7. <body>
  8. <div style="margin: auto; width: 80%">
  9. <form action="setCookies.jsp" method="POST">
  10. 用户名: <input type="text" name="username">
  11. Email: <input type="text" name="email" /> <input
  12. type="submit" value="提交" />
  13. </form>
  14. </div>
  15. </body>
  16. </html>
  17. HTML

当编写上面代码完成后,部署和运行这个项目,打开浏览器访问URL:http://localhost:8080/CookiesHandling/form.html , 在显示的表单中输入用户名和Email,然后单击提交按钮。这将在屏幕上显示用户名和Email,并且还将设置两个cookie:usernameemail。当下次访问页面时,这些Cookie将被传回服务器。

分别在用户名和Email输入框中填写:maxsumaxsu@yiibai.com , 然后点击提交 -

在下一节中,我们将介绍如何在Web应用程序中访问这些cookie。

使用JSP读取Cookies

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

现在来看看如何读取前面的例子中设置的cookie,创建一个JSP文件:getCookies.jsp -

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>读取Cookies</title>
  8. </head>
  9. <body>
  10. <div style="margin: auto; width: 80%;">
  11. <%
  12. Cookie cookie = null;
  13. Cookie[] cookies = null;
  14.  
  15. // Get an array of Cookies associated with the this domain
  16. cookies = request.getCookies();
  17.  
  18. if (cookies != null) {
  19. out.println("<h2>找到的Cookie名称和值</h2>");
  20.  
  21. for (int i = 0; i < cookies.length; i++) {
  22. cookie = cookies[i];
  23. out.print("Name : " + cookie.getName() + ", ");
  24. out.print("Value: " + cookie.getValue() + " <br/>");
  25. }
  26. } else {
  27. out.println("<h2>No cookies founds</h2>");
  28. }
  29. %>
  30. </div>
  31. </body>
  32. </html>
  33. HTML

重新部署项目,打开浏览器访问URL: http://localhost:8080/CookiesHandling/getCookies.jsp ,应该会看到结果如下 -

删除cookies非常简单。如果想要删除一个cookie,那么只需要按照这三个步骤 -

  • 读取已存在的cookie并将其存储在Cookie对象中。
  • 使用setMaxAge()方法将Cookie的过期时间设置为零,以删除现有的Cookie。
  • 将此cookie添加回响应头。

以下示例将显示如何删除名为username的现有Cookie,并且下次运行访问getcookies.jsp时,将不再返回username的cookies值。

文件:deleteCookies.jsp -

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>删除Cookies</title>
  8. </head>
  9. <body>
  10. <div style="margin: auto; width: 80%;">
  11. <center>
  12. <h1>删除Cookies</h1>
  13. </center>
  14. <%
  15. Cookie cookie = null;
  16. Cookie[] cookies = null;
  17.  
  18. // Get an array of Cookies associated with the this domain
  19. cookies = request.getCookies();
  20.  
  21. if( cookies != null ) {
  22. out.println("<h2>找到的Cookie名称和值</h2>");
  23. for (int i = 0; i < cookies.length; i++) {
  24. cookie = cookies[i];
  25. if(cookie.getName().equals("username")) {
  26. cookie.setMaxAge(0);
  27. response.addCookie(cookie);
  28. out.print("Deleted cookie: " + cookie.getName( ) + "<br/>");
  29. }
  30. out.print("Name : " + cookie.getName( ) + ", ");
  31. out.print("Value: " + cookie.getValue( )+" <br/>");
  32. }
  33. } else {
  34. out.println(
  35. "<h2>No cookies founds</h2>");
  36. }
  37. %>
  38. </div>
  39. </body>
  40. </html>
  41. HTML

重新部署项目,打开浏览器访问URL: http://localhost:8080/CookiesHandling/deleteCookies.jsp ,应该会看到结果如下 -

现在再次运行:getCookies.jsp,它应该只显示一个cookie,如下所示:

也可以手动删除浏览器中的Cookie。从工具菜单开始,选择Internet选项。要删除所有Cookie,请单击删除Cookie按钮。