64

我正在尝试使 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配置吗?

4

2 回答 2

123

现在,我被告知这将在使用的第 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 请求时,它将立即被销毁。

也可以看看:

于 2010-06-25T15:04:26.450 回答
13

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

不,那不是真的。在不活动的情况下session-timeout配置每个会话超时。

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

web.xml 中的设置是全局的,它适用于给定上下文的所有会话。以编程方式,您可以为特定会话更改此设置。

于 2010-06-25T15:09:50.353 回答