在 JSF 自定义验证器中区分 ajax 请求和完整请求

Posted

技术标签:

【中文标题】在 JSF 自定义验证器中区分 ajax 请求和完整请求【英文标题】:Distinguish ajax requests from full requests in JSF custom validator 【发布时间】:2011-11-17 16:31:44 【问题描述】:

我的验证器需要知道它是完整请求还是 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 库,我的解决方案是否“安全”?

更新:

刚刚发现 X-Requested-With 标头仅在 ajax 请求来自 Primefaces 组件库(<p:ajax>tag)时才存在。

如果我使用纯 JSF <f:ajax>,它存在。 所以我的方法不适用于 <f:ajax>

使用<f:ajax> 有不同的标头:

Faces-Request:partial/ajax

Osw 提出的解决方案适用于<f:ajax> <p:ajax>

PartialViewContext#isAjaxRequest()

【问题讨论】:

【参考方案1】:

我不会依赖 http 标头。自己从未尝试过,但您可以执行以下操作:

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

另一种选择是使用isPartialRequest() 而不是isAjaxRequest()

【讨论】:

感谢您的回答。听起来不错。你知道这个方法是做什么的吗?也许也只是检查标题。 @Matt,抱歉,不知道它到底做了什么,但选项是检查标头或检查请求参数映射。 更新了我的问题。看来我的解决方案不安全。 这是正确的。如果你碰巧使用OmniFaces,还有Faces-class,它提供isAjaxRequest()作为快捷方式,在EL中也可以使用#faces.ajaxRequest【参考方案2】:

我希望这是一种可靠的检查方式。这正是 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

【讨论】:

感谢您的回答。更新了我的问题。好像我的解决方案不安全。

以上是关于在 JSF 自定义验证器中区分 ajax 请求和完整请求的主要内容,如果未能解决你的问题,请参考以下文章

JSF ajax 验证不验证需要 true 的项目

JSF 自定义组件:如何获取 <f:ajax /> 的属性

如何在 JSF 中执行验证,如何在 JSF 中创建自定义验证器

在事件上调用jsf自定义验证器

如何在 JSF 中为标准验证器设置自定义消息?

RestKit:在 didLoadResponse 中区分多个请求: