如何忽略回发调用的过滤器

时间:2013-09-01 16:25:59

标签: ajax jsf postback servlet-filters

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

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

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

3 个答案:

答案 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)

您必须更清楚地定义功能要求。你现在太模糊了,混合了几个概念。

您想要检查什么?

  1. 这是GET请求。
  2. 这不是JSF ajax POST请求。
  3. 这不是POST请求。
  4. 您当前的问题标题“如何忽略过滤回拨电话”涵盖2和3.您当前的问题正文“需要id-parameter(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.
      }
      
    4. 他们都完全不同:

      1. 这不仅排除了POST,还包括例如PUT和OPTIONS请求。
      2. 这不排除同步JSF POST请求(例如,没有<f:ajax>的提交按钮)。
      3. 这也排除了所有其他类型的POST请求。
      4. 三思而后行,最终只需使用合适的工具。


        另一种方法是在表单操作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"));
}