我的验证器需要知道它是完整请求还是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组件库(<p:ajax>
标记)时才会出现 X-Requested-With 标头。
如果我使用普通JSF <f:ajax>
,则不。 所以我的方法不适用于 <f:ajax>
。
使用<f:ajax>
有一个不同的标题:
Faces-Request:partial/ajax
Osw提出的解决方案适用于<f:ajax>
和 <p:ajax>
:
答案 0 :(得分:17)
我不会依赖http标头。从来没有尝试过,但你可以做到以下几点:
PartialViewContext pvc = facesContext.getPartialViewContext();
if(pvc.isAjaxRequest()) {
// ...
} else {
// ...
}
另一种选择是使用isPartialRequest()
而不是isAjaxRequest()
答案 1 :(得分:1)
我认为这是检查它的可靠方法。这正是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