Ответ 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
, потому что вы уже отправляете перенаправление заранее.