Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中跳过过滤器链中的过滤器_Java_Servlets_Servlet Filters - Fatal编程技术网

如何在java中跳过过滤器链中的过滤器

如何在java中跳过过滤器链中的过滤器,java,servlets,servlet-filters,Java,Servlets,Servlet Filters,我的应用程序中有2个过滤器。根据某些条件,我想选择是否执行第二个过滤器。有办法做到这一点吗 我在谷歌上搜索了一下,但没有成功。我希望请求在不执行第二个筛选器的情况下继续。可能吗 任何帮助都将不胜感激。您可以在请求中设置属性,并在第二个筛选器中进行检查 public class FirstFilter implements Filter { //... public void doFilter(ServletRequest servletRequest, ServletRespo

我的应用程序中有2个过滤器。根据某些条件,我想选择是否执行第二个过滤器。有办法做到这一点吗

我在谷歌上搜索了一下,但没有成功。我希望请求在不执行第二个筛选器的情况下继续。可能吗


任何帮助都将不胜感激。

您可以在请求中设置属性,并在第二个筛选器中进行检查

public class FirstFilter implements Filter {
    //...

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setAttribute("executeSecondFilter", true);
        //...
        if(someReason)
            servletRequest.setAttribute("executeSecondFilter", false);
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

public class SecondFilter implements Filter {
    //..

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        if (servletRequest.getAttribute("executeSecondFilter") == null || !((Boolean) servletRequest.getAttribute("executeSecondFilter"))) {
            filterChain.doFilter(servletRequest, servletResponse);
        }
        //...
    }
}

您可以这样简化上面的代码:

public class FirstFilter implements Filter {
    //...

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //...
        if(someReason)
            servletRequest.setAttribute("executeSecondFilter", false);
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

public class SecondFilter implements Filter {
    //..

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        if (servletRequest.getAttribute("executeSecondFilter") != null) {
            filterChain.doFilter(servletRequest, servletResponse);
        }
        //...
    }
}

通过这种方式,您只需检查属性“executeSecondFilter”的存在性。

除了Colin的答案之外,还有另一种方式:不调用,但是


但是这将跳过当前打开的所有过滤器,除了那些正在向前收听的过滤器之外,这是一个好主意,但是如果没有设置属性,这个示例将抛出NPE。@BalusC,这就是我为什么要放一个
!=true
,但是自动取消装箱胜过了对象比较,现在它被更正了:)您还可以使用
布尔值。true
。但是,我个人觉得它很难看;)在某种情况下写
true
,我已经感觉很糟糕了,而且在某种程度上
Boolean。true
会让我感觉更糟P@ColinHebert . 你好你对他的问题有什么解决办法吗:好办法。但是,我们认为我们应该使用属性方法,因为它有点简单。不客气。但是,当另一个过滤器的源代码完全不受您的控制(第三方等)时,这一个将是唯一的解决方案。这将修复以下问题:request.getRequestDispatcher(((HttpServletRequest)request.getServletPath()+StringUtils.defaultString(((HttpServletRequest)request.getPathInfo()).forward(请求,响应);科琼斯提出了一个很好的观点。根据您的应用程序,您可能需要请求的更多部分,而不仅仅是servlet路径。这个StackOverflow答案有一个很好的表格,显示了请求的哪些部分是哪些:非常感谢这个解决方案!
if (condition) {
    request.getRequestDispatcher(((HttpServletRequest) request).getServletPath()).forward(request, response);
} else {
    chain.doFilter(request, response);
}