Сеанс Vaadin setMaxInactiveInterval ответ пользовательского интерфейса непротиворечив

Я установил максимальный неактивный интервал для сеанса Vaadin следующим образом.

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

добавлен сеанс destroy listener, как показано ниже для тестирования.

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

этот слушатель вызывается в нужное время на стороне сервера. Однако я не вижу сообщение "сеанс истек" на стороне браузера одновременно. Обычно он отображается между 4-й и 5-й минутами. Есть ли способ, чтобы получить оба из них одновременно в соответствии манера.

также обратите внимание, что мы не используем push, и это не вариант для нас на данный момент.

выполнение опроса на стороне клиента сбросит последнее активное время сеансов и может сохранить сеанс активным навсегда, если интервал опроса меньше maxInactiveInterval.

3 ответов


приложение Vaadin поддерживает связь на стороне клиента и на стороне сервера во время жизненного цикла сеанса. Есть параметр calls heartbeatInterval значение по умолчанию 5 минут (300s). Таким образом, это означает, что каждые 5 минут клиентская сторона спрашивает сервер, если сеанс все еще жив. Именно поэтому, когда сеанс уничтожен, вы видите сообщение в консоли и только через некоторое время вы видите сообщение истекшего сеанса в браузере.

вы можете изменить heartbeatInterval свойство и установить меньшее значение (в секундах), но помните, что вам нужно установить closeIdleSessions=true явно так же. В приведенном ниже примере я установил это значение в 1 секунду.

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

проблема :

ваш сеанс недействителен на стороне сервера, все хорошо. Но проблема в том, что ваш клиент никогда не уведомляется об этом событии. Вы должны выполнить взаимодействие с сервером, чтобы получить сообщение с истекшим сроком действия сеанса, например, нажать кнопку, Обновить страницу и т. д...

Как это исправить?

чтобы исправить это, у вас есть некоторые решения:

  • используйте аннотацию @Push посмотреть Документация
  • клиентские силу обновления через getPage().reload ()
  • ничего не меняйте, и ваш тайм-аут сеанса появится при следующем действии на стороне клиента
  • реализуйте "Поиск сеанса" на стороне клиента, чтобы смотреть каждые X секунд, если сеанс все еще действителен, если он истек, просто вызовите страницу.getCurrent.reload () со стороны клиента.

будьте осторожны с @Push

в зависимости от используемого сервера приложений вы возможно, потребуется обновить его для поддержки @Push (мне пришлось с tomcat7, потому что tomcat7 не поддерживает WebSocket)


следующее решение работало для меня в этом сценарии не имея @ 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
}

затем в сеть.xml добавлен высокий пульс интервал, который будет выше, чем maxInactiveInterval.

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