在本章中,我们将讨论JSP中的会话跟踪. HTTP是一种"无状态"协议,这意味着每次客户端检索网页时,客户端都会打开一个与Web服务器的单独连接,服务器自动不会保留以前客户端请求的任何记录.
现在让我们讨论一些维护Web客户端和Web服务器之间会话的选项 :
网络服务器可以为每个Web客户端分配一个唯一的会话ID作为cookie,对于客户端的后续请求,可以使用收到的cookie识别它们.
这可能不是一种有效的方式,因为浏览器有时不支持cookie.建议不要使用此过程来维护会话.
Web服务器可以发送隐藏的HTML表单字段以及唯一的会话ID如下&&;
< input type ="hidden"name ="sessionid"value ="12345">
此条目表示在提交表单时,指定的名称和值会自动包含在 GET 或 POST 数据.每次Web浏览器发回请求时, session_id 值都可用于跟踪不同的Web浏览器.
这可能是一种有效的方式跟踪会话但点击常规(< A HREF ...>)超文本链接不会导致表单提交,因此隐藏的表单字段也不支持常规会话跟踪.
您可以在每个URL的末尾附加一些额外的数据.该数据标识会话;服务器可以将该会话标识符与它存储的有关该会话的数据相关联.
例如,使用 http://it1352.com/file.htm; sessionid = 12345 ,会话标识符附加为 sessionid = 12345 ,可以在Web服务器上访问以识别客户端.
URL重写是一个更好的方法来维护会话并在浏览器不支持cookie时工作.这里的缺点是您必须动态生成每个URL以分配会话ID,尽管页面是一个简单的静态HTML页面.
除了上面提到的选项之外,JSP还使用了提供HttpSession接口的servlet.此界面提供了一种识别用户的方法.
一页请求或
访问网站或
存储有关该用户的信息
默认情况下,JSP启用会话跟踪并且新的HttpSession对象会自动为每个新客户端实例化.禁用会话跟踪需要通过将页面指令会话属性设置为false来明确地将其关闭,如下所示 :
<%@ page session =" false"%>
JSP引擎通过隐式会话对象将HttpSession对象公开给JSP作者.由于 session 对象已经提供给JSP程序员,程序员可以立即开始存储和检索对象中的数据而无需任何初始化或 getSession().
以下是通过会话对象提供的重要方法的摘要 :
S.No. | Method&描述 |
---|---|
1 | public Object getAttribute(String name) 此方法返回在此会话中以指定名称绑定的对象,如果名称下没有绑定对象,则返回null. |
2 | public Enumeration getAttributeNames() 此方法返回一个Enumeration of String对象,其中包含绑定到此会话的所有对象的名称. |
3 | public long getCreationTime() 此方法返回创建此会话的时间,自格林威治标准时间1970年1月1日午夜起以毫秒为单位. |
4 | 公布ic 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) this method使用指定的名称将对象绑定到此会话. |
11 | public void setMaxInactiveInterval(int interval) 此方法以秒为单位指定时间s,在servlet容器使此会话无效之前的客户端请求之间. |
此示例描述如何使用HttpSession对象查找会话的创建时间和上次访问时间.如果一个会话尚不存在,我们会将新会话与请求相关联.
<%@ page import = "java.io.*,java.util.*" %> <% // Get session creation time. Date createTime = new Date(session.getCreationTime()); // Get last access time of this Webpage. 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 Webpage. 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中的的.运行URL后,您将收到以下结果 :
会话信息
会话信息 | value |
---|---|
id | 0AE3EC93FF44E3C525B4351B77ABB2D5 |
创建时间 | Tue Jun 08 17:26:40 GMT + 04:00 2010 |
上次访问的时间 | 2008年6月8日星期二: 26:40 GMT + 04:00 2010 |
用户ID | ABCD |
访问次数 | 0 |
现在尝试第二次运行相同的JSP,您将收到以下结果.
会话信息
信息类型 | value |
---|---|
id | 0AE3EC93FF44E3C525B4351B77ABB2D5 |
创建时间 | Tue Jun 08 17:26:40 GMT + 04:00 2010 |
上次访问时间 | Tue Jun 08 17:26:40 GMT + 04 :00 2010 |
用户ID | ABCD |
访问次数 | 1 |
当您完成用户的会话数据时,有几个选项 :
删除特定属性 : 您可以调用 public void removeAttribute(String name) 方法来删除与特定键关联的值.
删除整个会话 : 您可以调用 public void invalidate() 方法来丢弃整个会话.
设置会话超时 : 您可以调用 public void setMaxInactiveInterval(int interval) 方法来单独设置会话的超时.
将用户退出 : 支持servlet 2.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.