JSP的会话(Session)跟踪
以下内容引用自http://wiki.jikexueyuan.com/project/jsp/session-tracking.html:
会话(Session)
HTTP是一个“无状态”协议,这意味着每一次客户端检索Web页面时,客户端打开一个单独的Web服务器且服务器不会自动连接任何以前的客户端请求的记录。
Web客户端和Web服务器之间的会话有以下几种方式:
一、Cookies
网络服务器可以为每个Web客户端和使用已接收的Cookie可识别的来自客户端的后续请求分配一个唯一的会话ID作为Cookie。
这可能不是一个有效的方法,因为许多浏览器不支持Cookie,所以不建议使用这个过程来维护会话。(过时的看法,现在基本都支持Cookie)
二、隐藏的表单字段
一个Web服务器可以发送一个隐藏的HTML表单字段以及一个独特的会话ID,如下所示:
<input type="hidden" name="sessionid" value="12345">
这个条目意味着,提交表单时,指定的名称和值会自动包含在 GET 或 POST 数据中。每次当 web 浏览器发送回请求时,session_id 的值可以用来跟踪不同的 web 浏览器。
这可能是跟踪会话的一个有效的方式,但点击一个常规的(< a HREF…>)超文本链接不会引起表单提交,所以隐藏表单字段也不能支持通用会话跟踪。
三、URL重写
可以在每个识别会话的URL结尾添加一些额外的数据,且服务器可以用它存储的关于会话的数据与会话标识符关联起来。
例如,http://jsoft.com/file.htm?sessionid=12345
,会话标识符作为sessionid=12345
附加,也可以在Web服务器访问来识别客户端。
当它们不支持Cookie时,URL重写是维持会话和适用于浏览器的一个更好的方法,但缺点是尽管页面是简单的静态HTML页面,但需要动态的生成每个URL来分配一个会话ID。
四、会话对象
除了上面提到的三种方法,JSP使用Servlet提供的HttpSession接口,该接口提供了一种方法来识别网站中跨多个页面请求或访问的用户,并存储用户信息。
默认情况下,JSP为每个新的客户端自动的启用会话跟踪和一个新的被实例化的HttpSession对象。禁用会话跟踪需要通过设置页面指令会话属性为false显式地关闭它,如下所示:
<%@ page session="false" %>
JSP引擎通过隐式的Session对象暴露了HttpSession对象给JSP开发人员。由于会话对象已经提供给JSP程序员,程序员可以立即从对象中开始存储和检索数据,不需要任何初始化或getSession()。
这是会话对象的可用的重要方法的一个总结:
方法 | 描述 |
---|---|
public Object getAttribute(String name) | 该方法返回会话中与指定的名称绑定的对象,如果没有绑定对象名称,返回null。 |
public Enumeration getAttributeNames() | 该方法返回一个字符串对象的枚举,其中包含绑定到这个会话的所有对象的名字。 |
public long getCreationTime() | 该方法返回创建会话的时间,自GMT时间1970年1月1日凌晨以来,以毫秒为单位。 |
public String getId() | 该方法返回一个字符串,其中包含分配给这个会话的唯一标识符。 |
public long getLastAccessedTime() | 该方法返回上次客户端发送与这个会话相关的请求的时间,自GMT时间1970年1月1日凌晨以来,毫秒的数量。 |
public int getMaxInactiveInterval() | 该方法返回最大时间间隔,以秒为单位,Servlet容器在客户端访问中将打开这个会话。 |
public void invalidate() | 这个方法使会话无效并解除全部绑定到该会话的对象。 |
public boolean isNew() | 如果客户端还不知道会话或如果客户选择不加入会话,这个方法返回true。 |
public void removeAttribute(String name) | 该方法从会话中删除制定名称的绑定对象。 |
public void setAttribute(String name, Object value) | 该方法使用指定的名称解除会话的一个对象。 |
public void setMaxInactiveInterval(int interval) | 在Servlet容器使这个会话无效之前,这种方法在客户端请求之间指定了时间,以秒为单位。 |
五、会话跟踪示例
这个例子描述了如何使用HttpSession对象发现一个会话的创建时间和上次访问时间。如果会话不存在,将会使请求与一个新的会话相关联。
<%@ page import="java.io.*,java.util.*" %>
<%
// Get session creation time.
Date createTime = new Date(session.getCreationTime());
// Get last access time of this web page.
Date lastAccessTime = new Date(session.getLastAccessedTime()); String title = "Welcome Back to my website";
Integer visitCount = new Integer(0);
String visitCountKey = new String("visitCount");
String userIDKey = new String("userID");
String userID = new String("ABCD"); // Check if this is new comer on your web page.
if (session.isNew()){
title = "Welcome to my website";
session.setAttribute(userIDKey, userID);
session.setAttribute(visitCountKey, visitCount);
}
visitCount = (Integer)session.getAttribute(visitCountKey);
visitCount = visitCount + 1;
userID = (String)session.getAttribute(userIDKey);
session.setAttribute(visitCountKey, visitCount);
%>
<html>
<head>
<title>Session Tracking</title>
</head>
<body>
<center>
<h1><%= title %></h1>
</center>
<table border="1" align="center">
<tr bgcolor="#949494">
<th>Session info</th>
<th>Value</th>
</tr>
<tr>
<td>id</td>
<td><% out.print( session.getId()); %></td>
</tr>
<tr>
<td>Creation Time</td>
<td><% out.print(createTime); %></td>
</tr>
<tr>
<td>Time of Last Access</td>
<td><% out.print(lastAccessTime); %></td>
</tr>
<tr>
<td>User ID</td>
<td><% out.print(userID); %></td>
</tr>
<tr>
<td>Number of visits</td>
<td><% out.print(visitCount); %></td>
</tr>
</table>
</body>
</html>
现在将上述代码添加到main.jsp中并尝试访问 http://localhost:8080/main.jsp
。当第一次运行时将会出现如下所示的结果:
现在尝试第二次运行相同的JSP,将会出现如下所示的结果。
六、删除会话数据
当完成了用户会话数据,有以下几种选择:
删除一个特定的属性:可以调用public void removeAttribute(String name)方法来删除与特定的键相关的值。
删除整个会话:可以调用public void invalidate()方法来删除整个会话。
设置会话超时:可以调用public void setMaxInactiveInterval(int interval)方法分别为每个会话设置超时。
注销用户:服务器可以支持Servlet 2.4,可以调用logout来注销Web服务器的客户端,并使所有属于该的用户的会话无效。
- 重启Web服务器。
- web.xml配置: 如果使用的是Tomcat,除了上述方法外,还可以在web.xml文件中设置会话超时,如下所示。
<session-config>
<session-timeout>15</session-timeout>
</session-config>
超时以分钟为单位,在Tomcat中,默认的超时为30分钟。
在Servlet中的getMaxInactiveInterval()方法为会话一个以秒为单位的超时时间。所以如果会话在web.xml中设置为15分钟,那么getMaxInactiveInterval()返回900。
测试工程:https://github.com/easonjim/5_java_example/tree/master/jspbasics/test10
最新文章
- ORA-02429: cannot drop index used for enforcement of unique /primary key
- 【BZOJ-4199】品酒大会 后缀数组 + 并查集合并集合
- Sql Server 查询第30条数据到第40条记录数
- z-index无效
- HDU 4799 LIKE vs CANDLE 树形dp
- 安装配置MongoDB数据库
- 开源的 Restful Api 集成测试工具 Hitchhiker
- Centos7.4下用Docker-Compose部署WordPress
- python入门(13)获取函数帮助和调用函数
- SpringMVC SessionAttributes 简述
- SQL Server进阶 遍历表的几种方法
- 使用PgBouncer连接池
- IIS7下,显示PHP错误(不显示500错误,而显示详细错误)
- Installing Fonts programatically C#
- ubuntu 安装jdk7小结(转载)
- HDU 2057 十六进制加减法
- 深入探索AngularJS
- chrome如何在选项卡打开网页
- claim概念图示
- 2018.07.22 洛谷P3106 GPS的决斗Dueling GPS's(最短路)