Отличать запросы ajax от полных запросов в пользовательском валидаторе JSF
мой валидатор должен знать, является ли это полным запросом или запросом ajax. В моем текущем решении я проверяю заголовок http-запроса для X-Requested-With
элемент:
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
HttpServletRequest req = (HttpServletRequest) context.getExternalContext().getRequest();
if (req.getHeader("X-Requested-With") != null) {
// do something
} else {
// do something else
}
...
}
есть ли лучший подход для достижения этой цели? Является ли мое решение "безопасным" в отношении разных браузеров / JavaScript-библиотек?
обновление:
узнал, что X-Запрошено-С заголовок присутствует, только если запрос ajax поступает из Библиотека компонентов Primefaces (<p:ajax>
tag).
это не присутствует, если я использую простой JSF <f:ajax>
. поэтому мой подход не будет работать с <f:ajax>
.
используя <f:ajax>
существует другой заголовок:
Faces-Request:partial/ajax
решение, предложенное Osw, работает для <f:ajax>
и <p:ajax>
:
2 ответов
Я бы не полагался на заголовок http. Никогда не пробовал сам, но вы могли бы сделать следующее:
PartialViewContext pvc = facesContext.getPartialViewContext();
if(pvc.isAjaxRequest()) {
// ...
} else {
// ...
}
другой вариант-это использовать isPartialRequest()
вместо isAjaxRequest()
Я бы сказал, что это надежный способ проверить его. Именно так, например, Django проверяет запросы AJAX:
def is_ajax(self):
return self.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'
также перечислены здесь как таковые: http://en.wikipedia.org/wiki/List_of_HTTP_header_fields