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

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

У меня есть следующее в моем лице-конфигурации:

<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-запрос:

  • ПОЧТА на исходную страницу лицевой стороны с кодом ответа 302
  • получить на страницу входа с кодом 200 (но ничего не происходит, потому что он запрашивается через Ajax)

Я использую MyFaces 2.1.10, Primefaces 3.5, Primefaces Extension 0.6.3 и Omnifaces 1.4.1 в WebLogic 12c

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

Спасибо

1 ответ

ПОЧТА на исходную страницу лицевой стороны с кодом ответа 302

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

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

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

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