web.xml中设置的超时时间在Java中无效

7

我正在尝试在Tomcat 7应用服务器上设置我的应用程序超时时间。首先,我在web.xml文件中将超时时间设置为1分钟,如下:

 <session-config>
       <session-timeout>1</session-timeout>
  </session-config> 

我正在使用HttpSessionListener来确保我的超时功能正常工作。我在web.xml文件中声明了我的sessionListener类。

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());
    }
}

在web.xml中

<listener>
    <listener-class>com.test.util.HttpSessionChecker</listener-class>
</listener>

但是当我启动服务器并启动应用程序时,我发现只有在登录页面上才会初始化会话。

Session ID 934073ED5E9933158995EE5EB680D3F7 created at Wed Nov 07 09:39:13 PST 2012

当我在应用程序中空闲时间超过一分钟或者有时甚至超过五分钟时,由于Tomcat不能立即启动超时计时器,所以当我点击应用程序中的某些东西时,Session并没有过期。我仍然能够浏览到另一个页面。但是,当我停留在登录页面或注销后,我看到Session已经被销毁。但是,一旦登录成功并且我在应用程序内部时,Session超时就不会发生。我看到...

Session ID 934073ED5E9933158995EE5EB680D3F7 destroyed at Wed Nov 07 09:42:13 PST 2012

我做错了什么?即使我在web.xml中提到了<session-timeout>,我需要在代码中使用session.invalidate吗? 在JSF中,当会话被销毁时,我该如何重定向到login.xhtml?


你的会话创建逻辑在哪里?你首先访问@SessionScoped bean在哪里?你是先检查活动会话再处理请求,还是默默地创建一个新的会话? - kolossus
检查JSF AJAX请求的会话超时处理 - Luiggi Mendoza
@kolossus...当我启动我的应用程序时,登录页面会打开Session Scoped的Login Bean。在登录时我们没有任何地方检查!(session.isNew())。我猜它正在创建一个新的会话。 - SRy
1个回答

9

您没有做错任何事情。后台线程会每 x 分钟检查会话是否过期,这取决于容器。也就是说,无法保证在指定的时间之后会过期。我知道在 Tomcat 中,您可以轻松地在 server.xml 文件中修改此检查间隔。


1
但是为什么当我登录并进入应用程序时,我的会话没有被销毁呢? - SRy
1
如果检查间隔大于超时值,则它还不会被销毁,原因相同。 - Marcus Blackhall
3
在server.xml文件中,我需要设置哪个间隔? - Michael
@MarcusBlackhall:我也在寻找相同的答案。 - Bee
1
找到了。它是<checkInterval>配置。请参见http://tomcat.apache.org/tomcat-7.0-doc/config/manager.html。 - Bee

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