现在,我被告知这将在使用的第15分钟终止会话(或者是所有会话?),无论他们的活动如何。
这是错误的。当关联的客户端(web浏览器)超过15分钟未访问网站时,它只会杀死会话。活动当然很重要,正如您最初预期的那样,看到您尝试解决此问题。
顺便说一句,HttpSession#setMaxInactiveInterval()
在这里没有太大变化。它的作用与 中完全相同,唯一的区别是您可以在运行时以编程方式更改/设置它。顺便说一句,这种更改只会影响当前会话实例,而不会全局影响(否则它将是一种方法)。<session-timeout>
web.xml
static
要自己玩并体验这一点,请尝试设置为1分钟并创建一个HttpSessionListener
,如下所示:<session-timeout>
@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 make/type)。因此,当您在处于非活动状态一分钟后立即在控制台中看不到线条时,请不要感到惊讶。但是,当您在超时但尚未销毁的会话上触发 HTTP 请求时,它将立即被销毁。destroyed
另请参阅: