一尘不染

SessionTimeout:web.xml与session.maxInactiveInterval()

java

我正在尝试使Java中的 HttpSession 超时。我的容器是WebLogic。

目前,我们在 web.xml 文件中设置了会话超时,如下所示

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

现在,我被告知这将在使用的第15分钟内终止会话(或所有会话?),无论其活动如何。

我想知道这种方法是否正确,还是应该以编程方式通过以下方式设置不活动的时间限制:

session.setMaxInactiveInterval(15 * 60); //15 minutes

我不想在15分钟内删除所有会话,而只删除15分钟内处于非活动状态的会话。

这些方法是否等效?我应该支持 web.xml 配置吗?


阅读 228

收藏
2020-09-09

共1个答案

一尘不染

现在,我被告知这将在使用的第15分钟内终止会话(或所有会话?), 无论其活动如何

这是 错的 。当关联的客户端(Web浏览器)超过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分钟,具体取决于负载和servlet容器的制造商/类型)。因此,当您destroyed在一分钟内没有活动后立即在控制台中看不到任何一行时,请不要感到惊讶。但是,当您在超时但尚未销毁的会话上触发HTTP请求时,该请求将立即被销毁。

2020-09-09