【问题标题】:How to ignore filter for postback calls如何忽略回发呼叫的过滤器
【发布时间】:2013-09-04 19:23:46
【问题描述】:

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

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

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

?

【问题讨论】:

    标签: ajax jsf postback servlet-filters


    【解决方案1】:

    我找到了一个很好的解决方案

    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;
        }
        ...
    }
    

    【讨论】:

      【解决方案2】:

      您必须更清楚地定义功能需求。您目前过于模糊,混淆了几个概念。

      您究竟想检查什么?

      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

      【讨论】:

        【解决方案3】:

        This workaround 正常工作:

        private boolean isAjax(HttpServletRequest request) {
            //Return if current request header is equals to "XMLHttpRequest"
            return "XMLHttpRequest".equals((request).getHeader("X-Requested-With"));
        }
        

        【讨论】:

        • 很遗憾,这个解决方案没有?在底部查看我自己的分析器
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多