【问题标题】:Vaadin session setMaxInactiveInterval UI response inconsistantVaadin 会话 setMaxInactiveInterval UI 响应不一致
【发布时间】:2015-11-26 05:53:56
【问题描述】:

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

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

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

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

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

另请注意,我们没有使用推送,目前我们不可以选择。

进行客户端轮询将重置会话的上次活动时间,如果轮询间隔小于 maxInactiveInterval,则可以永久保持会话活动。

【问题讨论】:

    标签: session vaadin session-timeout


    【解决方案1】:

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

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

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

    【讨论】:

    • 你也可以在 web.xml 部署描述符中修改这个区间:)
    • @Taras Klym ,它需要在服务器端错过三个热节拍才能使会话无效。默认情况下需要 15 分钟。问题中提到的方法已被使用,因为 heartbeatinterval 在部署后不可配置。
    • @Don,你几乎是对的,但是 heart-beat 有两个功能:第一个功能是如果用户在 3 次错过心跳后关闭应用程序或浏览器的选项卡,则服务器端的会话无效(默认情况下约为15 分钟)和第二个 - 通知客户端服务器上的会话已在下一次心跳时关闭(默认情况下约为 5 分钟)。在您描述的问题中,您有情况#2。服务器上的会话已被销毁,并显示下一个心跳的消息。
    • @Taras Klym,是的,在这种情况下,您的意思是不会在客户端同时通知用户。这是我面临的问题。
    • @Don 正是,这就是为什么如果你将 heartBeatInterval 更改为更小的秒数,你会减少这个差距。如果将 heartBeatInterval 设置为 1 秒,则会在 Server 上销毁 Session 的同时通知 User。
    【解决方案2】:

    问题:

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

    如何解决这个问题?

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

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

    小心@Push

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

    【讨论】:

    • 感谢您的回答,是的,我知道问题是客户端没有得到通知。但是,我们正在做没有 Push 的应用程序。什么也不做也不是一种选择,因为看起来会话还没有过期。强制刷新页面看起来像是一个选项。但我认为它不适用于被破坏的会话,因为没有客户端会话,所以没有“页面”之类的东西。如果我错了,请纠正我。
    • 使用 Page.getCurrent().reload() (更正了我的答案中的方法名称)应该刷新客户端页面,因为即使客户端 Session 过期,与之相关的 Page 对象应该仍然存在.在我看来,如果没有 Push,您将无法正确通知客户。我添加了我刚刚找到的另一个解决方案,以防它可以解决您的问题。
    • 是的,我还想过在客户端进行轮询以查看服务器是否还活着。但它不起作用,因为轮询服务器将重置会话的最后活动时间,并且因为该会话永远不会超时。
    • 通过检查会话是否有效,我的意思是您在服务器上请求一个布尔值以了解会话是否有效,而不是从服务器请求会话本身。
    • 是的,我知道,但要检查我们是否必须从客户端向服务器发送请求。然后会话因为投票而变得活跃。为此,轮询间隔必须高于会话超时时间。
    【解决方案3】:

    在没有启用 @Push 以及没有任何自定义 js 小部件的情况下,以下解决方案对我有用。 首先在主类中设置 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 间隔,该间隔将高于 ma​​xInactiveInterval

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

    【讨论】:

      猜你喜欢
      • 2021-09-13
      • 1970-01-01
      • 2014-11-28
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多