橘子味的心
标题:JSP会话Session跟踪

在本章中,我们将讨论JSP中的会话跟踪。 HTTP是一种“无状态”协议,这意味着每次客户端检索一个Web页面时,客户机打开与Web服务器的单独连接,并且服务器自动不保留先前客户端请求的任何记录。

维护Web客户端与服务器之间的会话

现在来讨论几个用来维护Web客户机和Web服务器之间会话的方式 -

1.Cookies

网络服务器可以将唯一的会话ID作为cookie分配给每个Web客户端,并为客户端提供后续请求,并使用接收到的cookie进行识别。

这可能不是有效的方式,因为浏览器有时不支持cookie。不建议使用此过程来维护会话。

2.隐藏表单字段

Web服务器可以发送隐藏的HTML表单域以及唯一的会话ID,如下所示:

  1. <input type = "hidden" name = "sessionid" value = "123456">
  2. HTML

当提交表单时,指定的名称和值将自动包含在GETPOST数据中。 每次Web浏览器发送请求时,session_id值都可以用于跟踪不同的Web浏览器。

这可以是跟踪会话的有效方法,但点击常规(<a href="...">)超文本链接不会产生表单提交,因此隐藏表单字段也不能支持常规会话跟踪。

3.网址重写

可以在每个网址的末尾附加一些额外的数据。该数据标识会话; 服务器可以将该会话标识符与其关于该会话存储的数据相关联。

例如,使用URL:http://www.yiibai.com/file.html;sessionid=123456789,会话标识符作为sessionid=123456789附加,可以在Web服务器上访问以识别客户端。

URL重写是一种更好的方法来维护会话,并且在浏览器不支持cookie时可以使用它们。 这里的缺点是,必须动态生成每个URL来分配会话ID,而页面是一个简单的静态HTML页面。

4.session对象

除了上述选项之外,JSP还使用了提供HttpSession接口的servlet。该接口提供了一种识别用户的方法。

  • 一个页请求或
  • 访问网站或
  • 存储有关该用户的信息

默认情况下,JSP启用会话跟踪,并为每个新客户端自动实例化一个新的HttpSession对象。 禁用会话跟踪需要通过将页面指令会话属性设置为false来明确地将其关闭,如下所示:

  1. <%@ page session = "false" %>
  2. HTML

JSP引擎通过隐式会话对象将HttpSession对象公开给JSP程序员。由于会话对象已经提供给JSP程序员,程序员可以立即开始从对象中存储和检索数据,而无需任何初始化或getSession()

以下是session对象提供的重要方法列表 -

编号 语法 描述
1 public Object getAttribute(String name) 此方法返回在此会话中用指定名称绑定的对象,如果在名称下没有绑定对象,则返回null
2 public Enumeration getAttributeNames() 此方法返回一个包含绑定到此会话的所有对象的名称的String对象枚举。
3 public long getCreationTime() 此方法返回创建此会话的时间,以1970年1月1日GMT格林尼治时间以来的毫秒为单位。
4 public String getId() 此方法返回一个包含分配给此会话的唯一标识符的字符串。
5 public long getLastAccessedTime() 此方法返回客户端上次发送与此会话相关联的请求的时间,为1970年1月1日GMT以来的毫秒数。
6 public int getMaxInactiveInterval() 此方法返回servlet容器在客户端访问之间保持此会话的最长时间间隔(以秒为单位)。
7 public void invalidate() 此方法使该会话无效,并取消绑定绑定到该对象的任何对象。
8 public boolean isNew() 如果客户端还不知道会话或者客户端选择不加入会话,则此方法返回true
9 public void removeAttribute(String name) 此方法从此会话中删除与指定名称绑定的对象。
10 public void setAttribute(String name, Object value) 此方法使用指定的名称将对象绑定到此会话。
11 public void setMaxInactiveInterval(int interval) 此方法指定在servlet容器将使此会话无效之前,客户端请求之间的时间(以秒为单位)。

会话跟踪示例

此示例介绍如何使用HttpSession对象来查找会话的创建时间和最后访问的时间。如果尚不存在,会将新建会话与请求相关联。

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

创建一个JSP文件:index.jsp,如下代码 -

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ page import="java.io.*,java.util.*"%>
  4. <%
  5. // Get session creation time.
  6. Date createTime = new Date(session.getCreationTime());
  7.  
  8. // Get last access time of this Webpage.
  9. Date lastAccessTime = new Date(session.getLastAccessedTime());
  10.  
  11. String title = "Welcome Back to my website";
  12. Integer visitCount = new Integer(0);
  13. String visitCountKey = new String("visitCount");
  14. String userIDKey = new String("userID");
  15. String userID = new String("ABCD");
  16.  
  17. // Check if this is new comer on your Webpage.
  18. if (session.isNew()) {
  19. title = "Welcome to my website";
  20. session.setAttribute(userIDKey, userID);
  21. session.setAttribute(visitCountKey, visitCount);
  22. }
  23. visitCount = (Integer) session.getAttribute(visitCountKey);
  24. visitCount = visitCount + 1;
  25. userID = (String) session.getAttribute(userIDKey);
  26. session.setAttribute(visitCountKey, visitCount);
  27. %>
  28. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  29. <html>
  30. <head>
  31. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  32. <title>Session会话跟踪示例</title>
  33. </head>
  34. <body>
  35. <div style="margin: auto; width: 80%;">
  36. <center>
  37. <h2>
  38. Session会话跟踪示例
  39. </h1>
  40. </center>
  41.  
  42. <table border="1" align="center">
  43. <tr bgcolor="#949494">
  44. <th>会话信息</th>
  45. <th></th>
  46. </tr>
  47. <tr>
  48. <td>id</td>
  49. <td>
  50. <%
  51. out.print(session.getId());
  52. %>
  53. </td>
  54. </tr>
  55. <tr>
  56. <td>创建时间</td>
  57. <td>
  58. <%
  59. out.print(createTime);
  60. %>
  61. </td>
  62. </tr>
  63. <tr>
  64. <td>最近一次访问时间</td>
  65. <td>
  66. <%
  67. out.print(lastAccessTime);
  68. %>
  69. </td>
  70. </tr>
  71. <tr>
  72. <td>用户ID</td>
  73. <td>
  74. <%
  75. out.print(userID);
  76. %>
  77. </td>
  78. </tr>
  79. <tr>
  80. <td>访问次数</td>
  81. <td>
  82. <%
  83. out.print(visitCount);
  84. %>
  85. </td>
  86. </tr>
  87. </table>
  88. </div>
  89. </body>
  90. </html>
  91. HTML

编写完成上面代码后,部署项目然后运行,打开浏览器尝试访问:http://localhost:8080/SessionTracking/ 。将看到以下结果 -

现在尝试再次运行(刷新)相同的JSP页面,可以看到访问次数更新为2,如下图所示 -

删除会话数据

完成用户的会话数据后,有几个方式用来删除会话信息 -

  • 删除一个指定的属性 - 可以调用public void removeAttribute(String name)方法来删除与特定键相关联的值。
  • 删除整个会话信息 - 可以调用public void invalidate()方法来删除(丢弃)整个会话信息。
  • 设置会话超时 - 可以调用public void setMaxInactiveInterval(int interval)方法来单独设置会话的超时。
  • 注销登录用户 - 支持servlets 2.4的服务器,可以调用注销将客户端记录在Web服务器之外,并使属于用户的所有会话失效。
  • web.xml配置 - 如果使用的是Tomcat,除了上述方法外,还可以在web.xml文件中配置会话超时,如下所示-
    1. <session-config>
    2. <session-timeout>15</session-timeout>
    3. </session-config>
    4. XML
    <session-timeout>指定超时表示的时间单位为分钟,上面配置示例将覆盖Tomcat中30分钟的默认超时。

servlet中的getMaxInactiveInterval()方法以秒为单位返回该会话的超时时间。 因此,如果会话在web.xml中配置了15分钟,那么getMaxInactiveInterval()方法将返回900秒。