我有一个需要id参数(GET)的过滤器。这在我在导航链接中添加参数时工作正常。但是当我停留在同一个站点(例如ajax调用)时,过滤器会大喊大叫,因为id参数丢失了。
如果请求来自ajax,是否有机会忽略过滤器?
之类的东西public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if (FacesContext.getCurrentInstance().isPostback()) {...}
...
}
答案 0 :(得分:2)
我找到了一个工作正常的解决方案
private boolean isAJAXRequest(HttpServletRequest request) {
boolean check = false;
String facesRequest = request.getHeader("Faces-Request");
if (facesRequest != null && facesRequest.equals("partial/ajax")) {
check = true;
}
return check;
}
在过滤器的开头,只需将其添加为:
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
if(isAJAXRequest(req)){
System.out.println("IGNORE THIS FILTER, AJAX");
chain.doFilter(request, response);
return;
}
...
}
答案 1 :(得分:1)
您必须更清楚地定义功能要求。你现在太模糊了,混合了几个概念。
您想要检查什么?
您当前的问题标题“如何忽略过滤回拨电话”涵盖2和3.您当前的问题正文“需要id-parameter(GET)”封面1.你自己的答案涵盖2。
这真的不太清楚。所以,我将展示如何涵盖每一个:
检查是否是GET请求:
if ("GET".equals(request.getMethod())) {
// It's a GET request.
}
检查它是否不是JSF ajax POST请求:
if (!"partial/ajax".equals(request.getHeader("Faces-Request"))) {
// It's not a JSF ajax request.
}
检查它是否不是POST请求:
if (!"POST".equals(request.getMethod())) {
// It's not a POST request.
}
他们都完全不同:
<f:ajax>
的提交按钮)。三思而后行,最终只需使用合适的工具。
另一种方法是在表单操作URL中保留当前的GET查询字符串(即通过其根源解决问题而不是解决问题)。这在这里得到解答:Retaining GET request query string parameters on JSF form submit。
答案 2 :(得分:0)
This workaround正常工作:
private boolean isAjax(HttpServletRequest request) {
//Return if current request header is equals to "XMLHttpRequest"
return "XMLHttpRequest".equals((request).getHeader("X-Requested-With"));
}