在JSF自定义validation器中区分ajax请求和完整请求
我的validation器需要知道它是完整请求还是ajax请求。 在我当前的解决方案中,我检查X-Requested-With
元素的http请求标头:
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库,我的解决方案是否“安全”?
更新:
刚发现只有当ajax请求来自Primefaces组件库(
标签)时,才会出现X-Requested-With标头。
如果我使用普通的JSF 它就不存在了。 所以我的方法不适用于
。
使用有一个不同的标题:
Faces-Request:partial/ajax
Osw提出的解决方案适用于 和
:
PartialViewContext#isAjaxRequest()
我不会依赖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