Vaadin会话setMaxInactiveInterval UI响应不一致

Don*_*Don 12 session session-timeout vaadin

我已经为Vaadin会话设置了最大非活动时间间隔,如下所示.

VaadinSession.getCurrent().getSession().setMaxInactiveInterval(60); 
Run Code Online (Sandbox Code Playgroud)

添加了一个会话销毁监听器,如下所示进行测试.

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

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

另请注意,我们目前还没有使用推送功能,目前我们不能选择它.

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

小智 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 {
    }
Run Code Online (Sandbox Code Playgroud)


Don*_*Don 1

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

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

    }
Run Code Online (Sandbox Code Playgroud)

我们必须默认会话过期消息,如下所示。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
}
Run Code Online (Sandbox Code Playgroud)

然后在 web.xml 中添加高心跳间隔,该间隔将高于maxInactiveInterval

<context-param>
    <param-name>heartbeatInterval</param-name>
    <param-value>1200</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)