FullAjaxExceptionHandler не перенаправляет страницу ошибки после недействительного сеанса

У меня возникают проблемы с Omnifaces FullAjaxExceptionHandler (http://showcase.omnifaces.org/exceptionhandlers/FullAjaxExceptionHandler). Он не перенаправляется на указанную страницу ошибки после того, как сеанс недействителен.

У меня есть следующие в моих лицах: config:

<factory>
    <exception-handler-factory>org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory</exception-handler-factory>
</factory>

И в моем web.xml следующее:

<error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/pages/error/viewExpired.html</location>
</error-page>

После того как я аннулировал сеанс, с точки зрения пользователя ничего не происходит. Приложение просто "мертво". В моей консоли я вижу следующий запрос Ajax:

  • POST на исходную страницу facelet с кодом ответа 302
  • a GET на страницу входа с кодом 200 (но ничего не происходит, потому что запрашивается через Ajax)

Я запускаю MyFaces 2.1.10, Primefaces 3.5, Extensions Extensions 0.6.3 и Omnifaces 1.4.1 на WebLogic 12c

Может ли кто-нибудь помочь мне в правильном направлении? Как заставить FullAjaxExeptionHandler работать правильно?

Спасибо

Ответ 1

POST на исходную страницу facelet с кодом ответа 302

Это неправильно. Переадресация на JSF-запрос ajax должен иметь код ответа 200 со специальным ответом XML с элементом <redirect> с целевым URL в его атрибуте url.

Это означает, что вы вручную использовали HttpServletResponse#sendRedirect() где-то задолго до того, как JSF имеет возможность иметь дело с ViewExpiredException.

Возможно, у вас есть фильтр сервлета, который проверяет какой-либо атрибут сеанса и отправляет перенаправление в зависимости от его наличия/состояния? Затем этот фильтр следует манипулировать на основе следующего ответа: Фильтр JSF не перенаправляет после Первичного перенаправления, чтобы распознать запросы ajax JSF и вернуть специальный XML-ответ вместо 302 ответ.

например.

if ("partial/ajax".equals(request.getHeader("Faces-Request"))) {
    response.setContentType("text/xml");
    response.getWriter()
        .append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
        .printf("<partial-response><redirect url=\"%s\"></redirect></partial-response>", loginURL);
} else {
    response.sendRedirect(loginURL);
}

Все это полностью не связано с FullAjaxExceptionHandler. JSF не имел шанса выбросить ViewExpiredException, потому что вы уже отправляете перенаправление заранее.