SessionTimeout:web.xml与session.maxInactiveInterval()

Tom*_*Tom 58 java session servlets weblogic session-timeout

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

目前,我们在web.xml文件中设置了会话超时,就像这样

<session-config>
    <session-timeout>15</session-timeout>
</session-config>
Run Code Online (Sandbox Code Playgroud)

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

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

session.setMaxInactiveInterval(15 * 60); //15 minutes
Run Code Online (Sandbox Code Playgroud)

我不想在15分钟内放弃所有会话,只有那些在15分钟内处于非活动状态的会话.

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

Bal*_*usC 118

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

这是错的.当关联的客户端(webbrowser)访问网站超过15分钟时,它将会终止会话.正如您最初预期的那样,活动肯定会重要,看到您尝试解决此问题.

HttpSession#setMaxInactiveInterval()不通过的方式在这里多变化.它与<session-timeout>in 完全相同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());
    }

}
Run Code Online (Sandbox Code Playgroud)

(如果你还没有使用Servlet 3.0,因此无法使用@WebListener,请web.xml按以下方式注册):

<listener>
    <listener-class>com.example.HttpSessionChecker</listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)

请注意,servletcontainer在完全超时值后不会立即销毁会话.这是一个后台工作,以一定的时间间隔运行(例如5到15分钟,具体取决于负载和servletcontainer品牌/类型).因此,如果destroyed在一分钟不活动后没有立即在控制台中看到线路,请不要感到惊讶.但是,当您在超时但未被破坏的会话上触发HTTP请求时,它将立即被销毁.

也可以看看:

  • 另外需要注意的一点是 - 在web.xml中将值设置为0或更小意味着会话永远不会超时(不管servlet容器是否还活着).但是,以编程方式将其设置为0会导致会话立即超时(将其设置为负数意味着会话将永远不会超时,与web.xml中相同). (20认同)

Pas*_*ent 12

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

不,那不是真的.该session-timeout配置在每个会话超时在闲置情况下.

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

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