Отличать запросы 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>:

PartialViewContext#isAjaxRequest()

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