【发布时间】:2011-04-13 21:10:34
【问题描述】:
我的应用程序中有 2 个过滤器。根据某些条件,我想选择是否执行第二个过滤器。有没有办法做到这一点?
我做了一些谷歌搜索,但没有成功。我希望请求继续而不执行第二个过滤器。这可能吗?
任何帮助将不胜感激。
【问题讨论】:
标签: java servlets servlet-filters
我的应用程序中有 2 个过滤器。根据某些条件,我想选择是否执行第二个过滤器。有没有办法做到这一点?
我做了一些谷歌搜索,但没有成功。我希望请求继续而不执行第二个过滤器。这可能吗?
任何帮助将不胜感激。
【问题讨论】:
标签: java servlets servlet-filters
除了科林的回答,还有一个办法:就是不要叫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,但是自动拆箱胜过对象比较,现在它已经更正了:)
Boolean.TRUE。但是,我个人觉得它很丑;)
true 感到非常难过,在某种程度上Boolean.TRUE 会让我感觉更糟。 :P