Vaadin会话setMaxInactiveInterval UI响应不一致

时间:2015-09-01 05:23:01

标签: session vaadin session-timeout

我已将Vaadin会话的最大非活动时间间隔设置如下。

VaadinSession.getCurrent().getSession().setMaxInactiveInterval(60); 

添加了一个会话破坏监听器,如下所示进行测试。

    servletService.addSessionDestroyListener(new SessionDestroyListener() {
    public void sessionDestroy(SessionDestroyEvent event) {
        System.out.println("SESSION TIMEOUT");
    }
});

在服务器端的所需时间调用此侦听器。 但是我看不到"会话已过期"同时在浏览器端显示消息。通常它会在第4到第5分钟之间显示。 有没有办法以一致的方式同时获得这两者。

另请注意,我们目前不使用推送,但目前我们不能选择推送。

执行客户端轮询将重置会话的上一个活动时间,并且如果轮询间隔小于maxInactiveInterval,则可以使会话永远保持活动状态。

2 个答案:

答案 0 :(得分:5)

Vaadin应用程序在会话生命周期中保持客户端和服务器端通信。参数调用 heartbeatInterval ,默认值 5分钟(300秒)。因此,这意味着如果会话仍然存在,则每隔5分钟客户端询问服务器。这就是为什么当Session被销毁时你会在Console中看到消息,并且只有在一段时间后你才能在浏览器中看到Session Expired消息。

您可以更改 heartbeatInterval 属性并设置较小的值(以秒为单位),但请记住,您还需要明确设置 closeIdleSessions = true 。在下面的示例中,我将此值设置为1秒。

@VaadinServletConfiguration(heartbeatInterval=1, closeIdleSessions=true, productionMode = false, ui = MyUI.class)
    public static class Servlet extends VaadinServlet {
    }

答案 1 :(得分:3)

问题:

您的会话在服务器端无效,一切都很好。但问题是您的客户端从未收到此事件的通知。您必须与服务器进行交互才能获得会话过期消息,例如按下按钮,刷新页面等...

如何解决这个问题?

要解决此问题,您需要一些解决方案:

  • 使用@Push批注see Documentation
  • 使用getPage()。reload()
  • 强制客户端刷新
  • 不做任何更改,会话超时将显示在下一个客户端操作
  • 实施"会话查询"如果会话仍然有效,在客户端观察每X秒,如果它已过期,只需从客户端调用Page.getCurrent.reload()。

小心使用@Push

根据您正在使用的应用程序服务器,您可能需要更新它以支持@Push(我不得不使用tomcat7,因为tomcat7不支持WebSocket)