FullAjaxExceptionHandler при запросе AJAX перенаправляет на страницу ошибки, с которой не работает перенаправление
У меня есть сценарий использования, когда пользователь выходит из приложения, после чего он перенаправляется на страницу входа. index.xhtml
но не закрывает эту вкладку браузера. Через некоторое время она пытается войти снова с той же вкладки. После этого ViewExpiredException
брошен
Я хотел бы, чтобы приложение обновляло страницу индекса в этом сценарии использования и позволяло пользователю снова войти в систему. Я думал, что я должен ловить ViewExpiredException
переадресация веб-браузера на страницу ошибок, где пользователь может быть проинформирован об этой ошибке сеанса, а затем повторное перенаправление браузера на страницу индекса.
Следуя инструкциям на этой странице /questions/35864520/javaxfacesapplicationviewexpiredexception-predstavlenie-ne-mozhet-byit-vosstanovleno/35864527#35864527 под пунктом Обработка ViewExpiredException, у меня есть эта конфигурация:
- внутри моего
web.xml
:
<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
который не навязывал никаких изменений в этом поведении.