Используя 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 в качестве ответа.

Он должен работать.

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