Distinguish ajax requests from full requests in JSF custom validator

两盒软妹~` 提交于 2020-01-01 08:32:50

问题


My validator needs to know if it is a full request or an ajax request. In my current solution I check the http request header for the X-Requested-With element:

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
        }
       ...
}

Is there a better approach to achieve this? Is my solution "safe" with respect to different browsers / javascript libs?

UPDATE:

Just found out that the X-Requested-With header is only present if the ajax request comes from the Primefaces component library (the <p:ajax>tag).

It is not present if I use plain JSF <f:ajax>. So my approach won't work with <f:ajax>.

Using <f:ajax> there is a different header:

Faces-Request:partial/ajax

The solution proposed by Osw works for <f:ajax> and <p:ajax>:

PartialViewContext#isAjaxRequest()


回答1:


I would not rely on http header. Never tried it by myself, but you could do the following:

PartialViewContext pvc = facesContext.getPartialViewContext();
if(pvc.isAjaxRequest()) {
// ...
} else {
// ...
}

Another option is using isPartialRequest() instead of isAjaxRequest()




回答2:


I'd that it is a reliable way to check it. This is exactly how for example Django checks for AJAX requests:

 def is_ajax(self):
        return self.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'

Also listed here as such: http://en.wikipedia.org/wiki/List_of_HTTP_header_fields



来源:https://stackoverflow.com/questions/7428058/distinguish-ajax-requests-from-full-requests-in-jsf-custom-validator

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!