У меня есть сценарий использования, когда пользователь выходит из приложения, после чего он перенаправляется на страницу входа в систему index.xhtml
, но не закрывает эту вкладку браузера.Через некоторое время она пытается войти снова с той же вкладки.После этого выдается ViewExpiredException
.
Я бы хотел, чтобы приложение обновило страницу индекса в этом сценарии использования и позволило пользователю снова войти в систему.Я подумал, что мне нужно перехватить ViewExpiredException
, переадресовать веб-браузер на страницу ошибок, где пользователь мог получить информацию об этой ошибке сеанса, а затем снова перенаправить браузер на страницу индекса.
Следуя инструкциям на этой страницеhttps://stackoverflow.com/a/3642969/6359607 под пунктом Обработка ViewExpiredException У меня есть эта конфигурация:
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/errors/expired.xhtml</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/WEB-INF/errors/general.xhtml</location>
</error-page>
<error-page>
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>/WEB-INF/errors/expired.xhtml</location>
</error-page>
- внутри моего
faces-config.xml
:
<factory>
<exception-handler-factory>org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory</exception-handler-factory>
</factory>
- моя страница с ошибкой
expired.xhtml
выглядит следующим образом:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<ui:composition template="/templates/page-template.xhtml">
<ui:param name="pageTitle" value="Session is expired!" />
<ui:define name="html-head">
<meta http-equiv="refresh" content="3;url=#{request.contextPath}/index.xhtml?faces-redirect=true" />
</ui:define>
<ui:define name="panel-main">
<p>
<a href="#{request.contextPath}/index.xhtml?faces-redirect=true">
If the redirection doesn't work click here.
</a>
</p>
</ui:define>
</ui:composition>
</html>
Когда пользователь пытается войти на index.xhtml
страница после просмотра сеанса истекла * приложение бросает javax.faces.application.ViewExpiredException
:
SEVERE [org.omnifaces.exceptionhandler.FullAjaxExceptionHandler] (default task-12) [d358fee4-9640-48b4-9c82-e97add8dfc84][127.0.0.1]
FullAjaxExceptionHandler: An exception occurred during processing JSF ajax request. Error page '/WEB-INF/errors/expired.xhtml' will be shown.:
javax.faces.application.ViewExpiredException: viewId:/index.xhtml - View /index.xhtml could not be restored.
at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:218)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:133)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:201)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:670)
...
После чего оно перенаправляет веб-браузер на страницу expired.xhtml
(примечание: URL-адрес браузера не изменяется на expired.xhtml
, но остаетсяindex.xhtml
).Тогда страница не перенаправляется на страницу index.xhtml, как я думал, что это будет соответствовать ее метатегу.
Для целей теста, внутри моего web.xml
я пересылаю 404 ошибки на ту же страницу expired.xhtml
.Когда я ввожу какой-то несуществующий URL в браузер, он перенаправляется на expired.xhtml
, а затем перенаправляется на страницу index.xhtml
.
Кроме того, когда я перемещаю страницу expired.xhtml
из каталога WEB-INF идоступ к нему напрямую из веб-браузера, он правильно перенаправлен на страницу индекса.
Почему бы не перенаправить веб-браузер с expired.xhtml
на страницу индекса в описанном сценарии использования?И как я могу решить это перенаправление?
Я пробовал много вещей, среди которых расширение FullAjaxExceptionHandler
и FullAjaxExceptionHandlerFactory
, которое не налагало никаких изменений в этом поведении.