FullAjaxExceptionHandler при запросе AJAX перенаправляет на страницу ошибки, с которой не работает перенаправление - PullRequest
0 голосов
/ 03 мая 2019

У меня есть сценарий использования, когда пользователь выходит из приложения, после чего он перенаправляется на страницу входа в систему index.xhtml, но не закрывает эту вкладку браузера.Через некоторое время она пытается войти снова с той же вкладки.После этого выдается ViewExpiredException.

Я бы хотел, чтобы приложение обновило страницу индекса в этом сценарии использования и позволило пользователю снова войти в систему.Я подумал, что мне нужно перехватить ViewExpiredException, переадресовать веб-браузер на страницу ошибок, где пользователь мог получить информацию об этой ошибке сеанса, а затем снова перенаправить браузер на страницу индекса.

Следуя инструкциям на этой страницеhttps://stackoverflow.com/a/3642969/6359607 под пунктом Обработка 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, которое не налагало никаких изменений в этом поведении.

...