Используя JSF 2.0 / Facelets, есть ли способ присоединить глобальный слушатель ко всем вызовам AJAX?
Есть ли способ присоединить глобальный слушатель ко всем вызовам AJAX в JSF? Может быть, через слушателя фазы или что-то?
Вот загадка... Допустим, вы используете теги f:ajax и что-то вроде apache shiro, и вы позволяете своему сеансу истечь. Затем вы возвращаетесь и нажимаете кнопку, к которой прикреплен f:ajax. Сервер ответит перенаправлением 302 на страницу входа.
Пользователь ничего не видит. Они могут многократно щелкать и вызывать вызов ajax, но для них приложение просто "мертвое".
Итак, хотя я и есть, есть ли способ присоединить слушателя ко всем вызовам ajax в JSF? Если так, то я хотел бы отслеживать код ответа. Если это перенаправление, используйте window.navigate, чтобы отправить их по пути.
Я всегда открыт, чтобы услышать, как другие решили эту проблему!
2 ответа
Есть ли способ присоединить глобальный слушатель ко всем вызовам AJAX в JSF?Может быть, через слушателя фазы или что-то?
ДаPhaseListener
может сделать это. SystemEventListener
также.Filter
также.
Если вы находитесь внутри контекста JSF, то вы можете проверить следующим образом, является ли текущий запрос ajax-запросом или нет.
if (FacesContext.getCurrentInstance().getPartialViewContext().isAjaxRequest()) {
// It's an ajax request.
}
Если вы не в контексте JSF, например, внутриFilter
Затем вы можете проверить следующим образом, является ли текущий запрос AJAX-запросом JSF или нет.
if ("partial/ajax".equals(request.getHeader("Faces-Request"))) {
// It's a JSF ajax request.
}
Вот загадка... Допустим, вы используете теги f:ajax и что-то вроде apache shiro, и вы позволяете своему сеансу истечь.Затем вы возвращаетесь и нажимаете кнопку, к которой прикреплен f:ajax.Сервер ответит перенаправлением 302 на страницу входа.
Пользователь ничего не видит.Они могут многократно щелкать и вызывать вызов ajax, но для них приложение просто "мертвое".
Для принудительного перенаправления на запрос ajax требуется специальный ответ XML. Когда вы внутри контекста JSF, тоExternalContext#redirect()
уже принимает это неявно во внимание. Все, что вам нужно сделать, это написать это:
FacesContext.getCurrentInstance().getExternalContext().redirect(url);
Если вы не в контексте JSF, например, внутри Filter
тогда вам нужно написать весь XML-ответ самостоятельно. Например
response.setContentType("text/xml");
response.getWriter()
.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
.printf("<partial-response><redirect url=\"%s\"></redirect></partial-response>", url);
Чтобы перенаправить запрос jsf ajax, вам нужен xml следующим образом
<?xml version="1.0" encoding="UTF-8"?>
<partial-response>
<redirect url="XXX">
</redirect>
</partial-response>
Здесь XXX - это URL, который вы хотите перенаправить.
На ajax переадресация вызова не соответствует описанной выше, следовательно, перенаправление отсутствует.
Чтобы получить желаемый результат, используйте фильтр для всех jsf-запросов, за исключением нескольких страниц (страница входа в систему), и проверка сеанса является действительной, и если это действительно вызов jsf ajax путем проверки заголовка "Faces-Request", его значение должно быть "частичным /ajax"., Если сеанс истек и является ajax-запросом, отправьте выше xml в качестве ответа.
Он должен работать.