Сеанс 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>