目录

JSP - 会话跟踪( Session Tracking)

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

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

现在让我们讨论一些维护Web客户端和Web服务器之间会话的选项 -

Cookies

Web服务器可以将唯一的会话ID作为cookie分配给每个Web客户端,并且对于来自客户端的后续请求,可以使用收到的cookie来识别它们。

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

隐藏的表单字段

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

<input type = "hidden" name = "sessionid" value = "12345">

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

这可以是跟踪会话的有效方式,但单击常规()超文本链接不会导致表单提交,因此隐藏的表单字段也不能支持常规会话跟踪。

URL重写

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

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

URL重写是一种更好的方式来维护会话,并在浏览器不支持cookie时适用于浏览器。 这里的缺点是你必须动态生成每个URL以分配会话ID,尽管页面是一个简单的静态HTML页面。

会话对象

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

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

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

<%@ page session = "false" %>

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

以下是通过会话对象提供的重要方法的摘要 -

S.No. 方法和描述
1

public Object getAttribute(String name)

此方法返回在此会话中使用指定名称绑定的对象,如果名称下没有绑定任何对象,则返回null。

2

public Enumeration getAttributeNames()

此方法返回Enumeration of String对象,其中包含绑定到此会话的所有对象的名称。

3

public long getCreationTime()

此方法返回创建此会话的时间,以格林威治标准时间1970年1月1日午夜以来的毫秒数为单位进行测量。

4

public String getId()

此方法返回包含分配给此会话的唯一标识符的字符串。

5

public long getLastAccessedTime()

此方法返回客户端上次发送与此会话关联的请求的最后一次,作为自格林威治标准时间1970年1月1日午夜起的毫秒数。

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对象查找会话的创建时间和上次访问时间。 如果一个新会话尚不存在,我们会将该会话与该请求相关联。

<%@ 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后,您将收到以下结果 -

欢迎来到我的网站

Session Information

会话信息
id0AE3EC93FF44E3C525B4351B77ABB2D5
创作时间 Tue Jun 08 17:26:40 GMT + 04:00 2010
最后访问时间 Tue Jun 08 17:26:40 GMT + 04:00 2010
用户身份 ABCD
访问次数 0

现在尝试第二次运行相同的JSP,您将收到以下结果。

欢迎回到我的网站

Session Information

信息类型
id0AE3EC93FF44E3C525B4351B77ABB2D5
创作时间 Tue Jun 08 17:26:40 GMT + 04:00 2010
最后访问时间 Tue Jun 08 17:26:40 GMT + 04:00 2010
用户身份 ABCD
访问次数 1

删除会话数据

完成用户的会话数据后,您有多种选择 -

  • Remove a particular attribute - 您可以调用public void removeAttribute(String name)方法来删除与特定键关联的值。

  • Delete the whole session - 您可以调用public void invalidate()方法来丢弃整个会话。

  • Setting Session timeout - 您可以调用public void setMaxInactiveInterval(int interval)方法来单独设置会话的超时。

  • Log the user out - 支持servlet 2.4的服务器,您可以调用logout将客户端记录到Web服务器之外,并使属于所有用户的所有会话无效。

  • web.xml Configuration - 如果您使用的是Tomcat,除了上述方法之外,您还可以在web.xml文件中配置会话超时,如下所示。

<session-config>
   <session-timeout>15</session-timeout>
</session-config>

超时以分钟表示,并覆盖Tomcat中的默认超时30分钟。

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

↑回到顶部↑
WIKI教程 @2018