Обработка ViewExireException / ajax и отображение диалогового окна Primefaces
Я не перенаправляю и не пересылаю своего пользователя на другую страницу. Так что, когда мойSessionExpiredExceptionHandler
(продолжаетсяExceptionHandlerWrapper
) обрабатывает исключение ViewExireException. Я хочу, чтобы пользователь оставался на той же странице и отображал диалог PrimeFaces. Для уведомления о том, что сеанс истек и что пользователю необходимо снова войти в систему (на основе диалога). Я использую функции Servlet 3.1 для входа / выхода пользователя иBasic/file
для auth-метода для сопоставления пользователей с различными системными ролями.
Сейчас происходит то, что представление / страница обновляется через 2 минуты, но сессия не становится недействительной. Это происходит только во второй раз, когда страница обновляется, через 4 мин.
<session-config>
<session-timeout>2</session-timeout>
</session-config>
Редактировать: Который обновляется метатегом:
<meta http-equiv="refresh" content="#{session.maxInactiveInterval}" />
Как я могу сделатьSessionExpiredExceptionHandler
аннулировать объект сеанса (выход из сервлета), когда исключения возникают в первый раз, и как я могу вызвать JavaScript (expireDlg.show ()) на клиенте для отображения диалога PrimeFaces?
Я смотрел на некоторые другие темы, но не нашел жизнеспособного решения.Тайм-аут сессии
SessionExpiredExceptionHandler
@Override
public void handle() throws FacesException {
for (Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator(); i.hasNext();) {
ExceptionQueuedEvent event = i.next();
ExceptionQueuedEventContext context = (ExceptionQueuedEventContext) event.getSource();
Throwable t = context.getException();
if (t instanceof ViewExpiredException) {
ViewExpiredException vee = (ViewExpiredException) t;
FacesContext fc = FacesContext.getCurrentInstance();
Map<String, Object> requestMap = fc.getExternalContext().getRequestMap();
NavigationHandler nav = fc.getApplication().getNavigationHandler();
try {
requestMap.put("currentViewId", vee.getViewId());
nav.handleNavigation(fc, null, "Home");
fc.renderResponse();
} finally {
i.remove();
}
}
}
// At this point, the queue will not contain any ViewExpiredEvents.
// Therefore, let the parent handle them.
getWrapped().handle();
}
web.xml
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>/home.xhtml</location>
</error-page>