SessionTimeout: web.xml vs session.maxInactiveInterval()

我试图在Java中超时HttpSession。我的容器是WebLogic。

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

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

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

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

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

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

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


答案 1

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

是错误的。当关联的客户端(web浏览器)超过15分钟未访问网站时,它只会杀死会话。活动当然很重要,正如您最初预期的那样,看到您尝试解决此问题。

顺便说一句,HttpSession#setMaxInactiveInterval()在这里没有太大变化。它的作用与 中完全相同,唯一的区别是您可以在运行时以编程方式更改/设置它。顺便说一句,这种更改只会影响当前会话实例,而不会全局影响(否则它将是一种方法)。<session-timeout>web.xmlstatic


要自己玩并体验这一点,请尝试设置为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

另请参阅:


答案 2

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

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

这些方法是否等效?我应该喜欢网络.xml配置吗?

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


推荐