现在,我被告知这将在使用的第 15 分钟终止会话(或者是所有会话?),无论他们的活动。
这是错误的。当关联的客户端(网络浏览器)超过 15 分钟未访问该网站时,它将终止会话。正如您最初预期的那样,该活动当然很重要,因为您尝试解决此问题。
顺便说一句,这里的HttpSession#setMaxInactiveInterval()
变化不大。它与 中的完全相同<session-timeout>
,web.xml
唯一的区别是您可以在运行时以编程方式更改/设置它。顺便说一句,更改只会影响当前会话实例,而不是全局影响(否则它会是一种static
方法)。
要自己玩耍和体验,请尝试设置<session-timeout>
为 1 分钟并创建HttpSessionListener
如下内容:
@WebListener
public class HttpSessionChecker implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent event) {
System.out.printf("Session ID %s created at %s%n", event.getSession().getId(), new Date());
}
public void sessionDestroyed(HttpSessionEvent event) {
System.out.printf("Session ID %s destroyed at %s%n", event.getSession().getId(), new Date());
}
}
(如果您还没有使用 Servlet 3.0 并因此无法使用@WebListener
,请web.xml
按如下方式注册):
<listener>
<listener-class>com.example.HttpSessionChecker</listener-class>
</listener>
请注意,servletcontainer 不会在完全超时后立即销毁会话。这是一个以特定时间间隔运行的后台作业(例如 5~15 分钟,具体取决于负载和 servletcontainer 制作/类型)。destroyed
因此,当您在完全不活动一分钟后没有立即在控制台中看到线路时,请不要感到惊讶。但是,当您在超时但尚未销毁的会话上触发 HTTP 请求时,它将立即被销毁。
也可以看看: