📜  JSP-会话跟踪

📅  最后修改于: 2020-11-13 05:23:30             🧑  作者: Mango


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

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

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

饼干

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

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

隐藏表格栏位

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


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

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

URL重写

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

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

URL重写是维护会话的一种更好的方法,并且在浏览器不支持cookie时适用于它们。此处的缺点是,尽管页面是一个简单的静态HTML页面,但您必须动态生成每个URL才能分配会话ID。

会话对象

除了上述选项外,JSP还利用Servlet提供的HttpSession接口。该界面提供了一种识别用户的方法。

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

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

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

这是通过会话对象可用的重要方法的摘要-

S.No. Method & Description
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 the 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对象找出会话的创建时间和最后访问时间。如果不存在新会话,则将其与请求关联。

Session Tracking
   
   
   
      

Session Tracking

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

现在,将上面的代码放入main.jsp中,并尝试访问http:// localhost:8080 / main.jsp 。一旦运行URL,您将收到以下结果-

欢迎来到我的网站

会议信息

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

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

欢迎回到我的网站

会议信息

信息类型
ID 0AE3EC93FF44E3C525B4351B77ABB2D5
创作时间 2010年6月8日星期二17:26:40 GMT + 04:00
最后访问时间 2010年6月8日星期二17:26:40 GMT + 04:00
用户身份 A B C D
访问次数 1个

删除会话数据

完成用户的会话数据后,您可以有几个选择-

  • 删除特定属性-您可以调用公共void removeAttribute(String name)方法来删除与特定键关联的值。

  • 删除整个会话-您可以调用public void invalidate()方法来丢弃整个会话。

  • 设置会话超时-您可以调用public void setMaxInactiveInterval(int interval)方法来分别设置会话超时。

  • 注销用户-支持Servlet 2.4的服务器,您可以调用logout将客户端从Web服务器注销,并使属于所有用户的所有会话无效。

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


   15

超时以分钟表示,并覆盖默认超时(在Tomcat中为30分钟)。

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