如何在java中跳过filter链中的filter

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

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

任何帮助将不胜感激。

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

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的回答,还有另外一种方法:只是不要调用FilterChain#doFilter() ,而是调用RequestDispatcher#forward()

 if (condition) { request.getRequestDispatcher(((HttpServletRequest) request).getServletPath()).forward(request, response); } else { chain.doFilter(request, response); } 

但是这将跳过当前打开的所有filter,期望正在侦听FORWARDfilter。