发布于 2015-08-17 14:49:21 | 246 次阅读 | 评论: 0 | 来源: 网络整理
HTTP是一种“无状态”协议,这意味着每一个客户端检索网页,客户端打开一个单独的连接到Web服务器,服务器会自动不保留以前的客户端请求的任何记录的时间。
还是有以下三种方式来维护Web客户端和Web服务器之间的会话:
一个网络服务器可以分配一个唯一的会话ID作为一个cookie给每个Web客户端和从客户端就可以使用接收到的cookie确认后续请求。
这可能不是一个有效的方法,因为很多时候浏览器不支持Cookie,所以我不建议使用这个程序来维护会话。
Web服务器可以与一个唯一的会话ID发送一个隐藏的HTML表单字段,如下所示:
<input type="hidden" name="sessionid" value="12345">
此项目意味着,当表单被提交时,指定名称和值将自动包含在GET或POST数据。当Web浏览器发送请求回每一次,那么session_id的值可以用来保持不同的网页浏览器的跟踪。
这可能是保持会话的轨道,但点击常规(<A HREF...>)超文本链接不会导致表单提交,因此隐藏的表单字段也不能支持一般的会话跟踪的有效途径。
您可以附加上每一个标识会话在URL末尾,一些额外的数据,并且服务器可以是会话标识符与已经存储的有关会话数据关联起来。
例如,http://yiibai.com/file.html;sessionid=12345,会话标识符作为附加的sessionid=12345可以在web服务器进行访问,以确定客户端。
URL重写是一种更好的方式来维持会话和工程浏览器时,他们不支持Cookie,但是这里的缺点是,你会动态生成每个URL分配一个会话ID,但网页是简单的静态HTML页面。
除了上面提到的三种方式,JSP利用所提供的servlet HttpSession接口提供了一个方法来识别跨多个页面请求的用户或浏览到一个网站,并存储有关用户的信息。
默认情况下,JSP中有会话跟踪,并启用了新的HttpSession对象被自动实例化每一个新的客户端。禁用会话跟踪需要明确的page指令会话属性设置为false,如下所示将其关闭:
<%@ page session="false" %>
JSP引擎公开HttpSession对象的JSP提交通过隐式会话对象。由于会话对象已经提供给JSP,程序可以立即开始无需任何初始化或getSession()存储和检索的对象数据。
这里是可通过会话对象的重要方法概要:
S.N. | 方法 & 描述 |
---|---|
1 | public Object getAttribute(String name) This method returns the object bound with the specified name in this session, or null if no object is bound under the name. |
2 | public Enumeration getAttributeNames() This method returns an Enumeration of String objects containing the names of all the objects bound to this session. |
3 | public long getCreationTime() This method returns the time when this session was created, measured in milliseconds since midnight January 1, 1970 GMT. |
4 | public String getId() This method returns a string containing the unique identifier assigned to this session. |
5 | public long getLastAccessedTime() This method returns the last time the client sent a request associated with this session, as the number of milliseconds since midnight January 1, 1970 GMT. |
6 | public int getMaxInactiveInterval() This method returns the maximum time interval, in seconds, that the servlet container will keep this session open between client accesses. |
7 | public void invalidate() This method invalidates this session and unbinds any objects bound to it. |
8 | public boolean isNew( This method returns true if the client does not yet know about the session or if the client chooses not to join the session. |
9 | public void removeAttribute(String name) This method removes the object bound with the specified name from this session. |
10 | public void setAttribute(String name, Object value) This method binds an object to this session, using the name specified. |
11 | public void setMaxInactiveInterval(int interval) This method specifies the time, in seconds, between client requests before the servlet container will invalidate this session. |
这个例子说明如何使用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>Session Tracking</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。当您第一次运行,它会显示以下结果:
Session info | value |
---|---|
id | 0AE3EC93FF44E3C525B4351B77ABB2D5 |
Creation Time | Tue Jun 08 17:26:40 GMT+04:00 2010 |
Time of Last Access | Tue Jun 08 17:26:40 GMT+04:00 2010 |
User ID | ABCD |
Number of visits | 0 |
现在尝试第二次运行同一个JSP,它会显示以下结果。
info type | value |
---|---|
id | 0AE3EC93FF44E3C525B4351B77ABB2D5 |
Creation Time | Tue Jun 08 17:26:40 GMT+04:00 2010 |
Time of Last Access | Tue Jun 08 17:26:40 GMT+04:00 2010 |
User ID | ABCD |
Number of visits | 1 |
当你与一个用户的会话数据完成后,您有几种选择:
删除一个特定的属性:您可以调用public void removeAttribute(String name) 方法来删除与特定的键关联的值。
删除整个会话:您可以调用public void invalidate() 方法放弃整个会话。
设置会话超时:您可以调用 public void setMaxInactiveInterval(int interval) 方法来单独设置超时会话。
注销用户:支持Servlet2.4服务器,你可以调用注销登录客户端出来的Web服务器和无效属于所有用户的所有会话。
web.xml中配置: 如果您使用的是Tomcat,除了上面提到的方法,您可以配置会话超时在web.xml文件中,如下所示。
<session-config>
<session-timeout>15</session-timeout>
</session-config>
超时表示为分钟,并覆盖默认的超时时间是在Tomcat中为30分钟。
在一个servlet 的 getMaxInactiveInterval()方法返回以秒为单位的会话超时时间。所以,如果你的会话配置在web.xml中为15分钟,那么getMaxInactiveInterval()返回900。