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

Van*_*ran 23 java servlets servlet-filters

我的应用程序中有2个过滤器.基于某些条件,我想选择是否执行第二个过滤器.有没有办法做到这一点?

我做了一些谷歌搜索没有成功.我希望请求继续而不执行第二个过滤器.那可能吗?

任何帮助将不胜感激.

Bal*_*usC 58

除了科林的回答,还有另一种方式:只是不要打电话FilterChain#doFilter(),但是RequestDispatcher#forward().

if (condition) {
    request.getRequestDispatcher(((HttpServletRequest) request).getServletPath()).forward(request, response);
} else {
    chain.doFilter(request, response);
}
Run Code Online (Sandbox Code Playgroud)

但是这将跳过当前开启的所有过滤器,期待正在收听的过滤器<dispatcher>FORWARD</dispatcher>.

  • 别客气.然而,当另一个过滤器的源代码完全超出您的控制范围(第三方等)时,这个是唯一的解决方案. (8认同)
  • 上面的示例忘记了基本servlet路径之后的URL部分.这将解决这个问题:request.getRequestDispatcher(((HttpServletRequest)request).getServletPath()+ StringUtils.defaultString(((HttpServletRequest)request).getPathInfo())).forward(request,response); (8认同)

Col*_*ert 10

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

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);
        }
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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);
        }
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

这样您只需检查属性"executeSecondFilter"的存在