会话超时:web.xml与session.maxInactiveInterval()的比较

65

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

2个回答

124
现在,我被告知这将在使用的第15分钟终止会话(或者是所有会话?),无论其活动如何。
这是错误的。只有当相关客户端(Web浏览器)超过15分钟没有访问网站时,它才会终止会话。活动肯定会计算,正如您最初预期并尝试解决此问题一样。
顺便说一下,HttpSession#setMaxInactiveInterval() 在这里并没有改变太多。它与web.xml中的<session-timeout>完全相同,唯一的区别是您可以在运行时通过编程方式更改/设置它。顺便说一下,更改仅影响当前会话实例,而不是全局范围(否则它将成为静态方法)。

如果想要亲身尝试和体验这个功能,可以将<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());
    }

}

Great, I am here to help! What language do you need the text translated from and to?
<listener>
    <listener-class>com.example.HttpSessionChecker</listener-class>
</listener>

请注意,Servlet容器不会在超时时间正好后立即销毁会话。这是一个后台作业,以一定的间隔运行(例如,根据负载和Servlet容器的制造/类型为5〜15分钟)。因此,在确切的一分钟内没有活动后,如果您在控制台中没有看到destroyed行,请不要感到惊讶。但是,当您在已超时但尚未销毁的会话上触发HTTP请求时,它将立即被销毁。
另请参见:

1
此外,为了澄清,此配置适用于所有会话。 - Pace
20
还有一件事需要注意 - 在web.xml中将值设置为0或更低意味着会话永远不会超时(只要servlet容器仍然存在)。但是,以编程方式将其设置为0会立即使会话超时(将其设置为负数意味着会话永远不会超时,与在web.xml中相同)。 - CodeClimber
另外,请注意maxInactiveInterval默认为60秒。http://tomcat.apache.org/tomcat-6.0-doc/config/manager.html - stevebot
@BalusC,“当您在已超时但尚未销毁的会话上发出HTTP请求时,它将立即被销毁”,您是否知道会话是在执行任何控制器代码之前还是与控制器逻辑同时/异步销毁的?我猜测是1.但不确定。 - despot

13

现在,有人告诉我,这将会在使用的第15分钟终止会话(还是所有会话?),无论其活动情况如何。

不,这是不正确的。 session-timeout 配置在不活动时为每个会话设置超时时间。

这些方法是否等效?我应该偏向于使用 web.xml 配置吗?

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接