Vaadin 会话 setMaxInactiveInterval UI 响应不一致

Vaadin session setMaxInactiveInterval UI response inconsistant

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

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

添加了一个会话销毁侦听器,如下所示用于测试。

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

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

另请注意,我们没有使用推送,目前不适合我们。

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

问题:

您的会话在服务器端无效,一切正常。但问题是您的客户永远不会收到此事件的通知。您必须与服务器进行交互才能获得 Session Expired 消息,例如按下按钮、刷新页面等...

如何解决这个问题?

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

  • 使用@Push注解see Documentation
  • 使用 getPage().reload() 强制客户端刷新
  • 不做任何更改,您的会话超时将出现在下一个客户端操作中
  • 在客户端实施“会话查找”以每隔 X 秒查看一次会话是否仍然有效,如果会话已过期,只需从客户端调用 Page.getCurrent.reload()。

小心@Push

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

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

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

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

在没有启用@Push 以及没有任何自定义 js 小部件的情况下,以下解决方案对我有用。 首先在 main class 中设置 maxInactiveInterval,如下所示。仅显示与此解决方案相关的代码。

    public class MyApplication extends UI { 
      @Override
        protected void init(VaadinRequest request) {
VaadinSession.getCurrent().getSession().setMaxInactiveInterval(sessionTimeout);
    }

    }

我们必须默认会话过期消息如下。这已在 Vaadin 论坛中建议作为解决方案,它说它应该在会话超时的 15 秒内工作。

    public class CustomInitServlet extends VaadinServlet {
         getService().setSystemMessagesProvider(
                new SystemMessagesProvider() {
                    @Override
                    public SystemMessages getSystemMessages(SystemMessagesInfo systemMessagesInfo) {
                        CustomizedSystemMessages customizedSystemMessages = new CustomizedSystemMessages();
                        customizedSystemMessages.setSessionExpiredMessage(null);
                        customizedSystemMessages.setSessionExpiredCaption(null);
                        customizedSystemMessages.setSessionExpiredNotificationEnabled(true);
                        return customizedSystemMessages;
                    }
                });


// other code
}

然后在web.xml中添加高heartbeat间隔,这将高于maxInactiveInterval.

<context-param>
    <param-name>heartbeatInterval</param-name>
    <param-value>1200</param-value>
</context-param>