我的应用程序中有两个过滤器。根据某些条件,我想选择是否执行第二个过滤器。有没有办法做到这一点?
我进行了一些搜索,但没有成功。我希望请求在不执行第二个过滤器的情况下继续。这可能吗?
任何帮助将不胜感激。
我的应用程序中有两个过滤器。根据某些条件,我想选择是否执行第二个过滤器。有没有办法做到这一点?
我进行了一些搜索,但没有成功。我希望请求在不执行第二个过滤器的情况下继续。这可能吗?
任何帮助将不胜感激。
FilterChain#doFilter()
,而是使用RequestDispatcher#forward()
。if (condition) {
request.getRequestDispatcher(((HttpServletRequest) request).getServletPath()).forward(request, response);
} else {
chain.doFilter(request, response);
}
但这将跳过当前所有的过滤器,除了那些监听<dispatcher>FORWARD</dispatcher>
的过滤器。
您可以在请求中设置一个属性,并在第二个过滤器中进行检查。
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”的存在即可。
!= true
,但自动拆箱胜过对象比较,现在已经纠正 :) - Colin HebertBoolean.TRUE
。然而,我个人觉得它看起来很丑陋 ;) - BalusCtrue
感到非常糟糕,而以Boolean.TRUE
的方式会让我感觉更糟。 :P - Colin Hebert