4

我有一个需要 id 参数 (GET) 的过滤器。当我在导航链接中添加参数时,这很好用。但是当我留在同一个站点(例如ajax 调用)时,过滤器会大喊大叫,因为 id 参数丢失了。

如果请求来自ajax,是否有机会忽略过滤器?就像是

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    if (FacesContext.getCurrentInstance().isPostback()) {...}
    ...
}

?

4

3 回答 3

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;
    }
    ...
}
于 2013-09-02T12:56:02.293 回答
1

您必须更清楚地定义功能需求。您目前太模糊并且混合了几个概念。

你到底想检查什么?

  1. 这是一个 GET 请求。
  2. 它不是 JSF ajax POST 请求。
  3. 这不是 POST 请求。

您当前的问题标题“如何忽略回发呼叫的过滤器”涵盖 2 和 3。您当前的问题主体“需要 id 参数 (GET)”涵盖 1。您自己的答案涵盖 2。

这个真的不清楚。所以,我将展示如何覆盖它们中的每一个:

  1. 要检查它是否是 GET 请求:

    if ("GET".equals(request.getMethod())) {
        // It's a GET request.
    }
    
  2. 要检查它是否不是 JSF ajax POST 请求:

    if (!"partial/ajax".equals(request.getHeader("Faces-Request"))) {
        // It's not a JSF ajax request.
    }
    
  3. 要检查它是否不是 POST 请求:

    if (!"POST".equals(request.getMethod())) {
        // It's not a POST request.
    }
    

它们都完全不同:

  1. 这不仅不包括 POST,还包括 PUT 和 OPTIONS 请求。
  2. 这不排除同步 JSF POST 请求(例如,不带 的提交按钮<f:ajax>)。
  3. 这也排除了所有其他类型的 POST 请求。

三思而后行,最终只为工作使用正确的工具。


另一种方法是在表单操作 URL 中保留当前的 ​​GET 查询字符串(即从根源解决问题,而不是解决问题)。这在这里得到了回答:Retaining GET request query string parameters on JSF form submit

于 2013-09-02T14:02:47.173 回答
0

此解决方法有效:

private boolean isAjax(HttpServletRequest request) {
    //Return if current request header is equals to "XMLHttpRequest"
    return "XMLHttpRequest".equals((request).getHeader("X-Requested-With"));
}
于 2013-09-01T21:10:54.523 回答