在 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 请求和完整请求的主要内容,如果未能解决你的问题,请参考以下文章