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 который не навязывал никаких изменений в этом поведении.

0 ответов

Другие вопросы по тегам