📅  最后修改于: 2020-11-13 05:23:30             🧑  作者: Mango
在本章中,我们将讨论JSP中的会话跟踪。 HTTP是一种“无状态”协议,这意味着每次客户端检索网页时,客户端都会打开与Web服务器的单独连接,并且服务器不会自动保留先前客户端请求的任何记录。
现在让我们讨论一些选项,以维护Web客户端和Web服务器之间的会话-
Web服务器可以将唯一的会话ID作为cookie分配给每个Web客户端,对于来自客户端的后续请求,可以使用接收到的cookie来识别它们。
这可能不是一种有效的方法,因为浏览器有时不支持cookie。不建议使用此过程来维护会话。
Web服务器可以发送隐藏的HTML表单字段以及唯一的会话ID,如下所示-
此项表示提交表单时,指定的名称和值将自动包含在GET或POST数据中。每次Web浏览器将请求发送回时, session_id值都可用于跟踪不同的Web浏览器。
这可能是跟踪会话的有效方法,但是单击常规()超文本链接不会导致提交表单,因此隐藏的表单字段也无法支持常规会话跟踪。
您可以在每个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。