【发布时间】:2015-03-29 23:07:51
【问题描述】:
我正在浏览 org.springframework.security.web.FilterChainProxy 类的源代码。我想了解它的 doFilter 方法是如何工作的。以下是代码。
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException
{
FilterInvocation fi = new FilterInvocation(request, response, chain);
List<Filter> filters = getFilters(fi.getRequestUrl());
if (filters == null || filters.size() == 0) {
if (logger.isDebugEnabled()) {
logger.debug(fi.getRequestUrl() +
filters == null ? " has no matching filters" : " has an empty filter list");
}
chain.doFilter(request, response);
return;
}
VirtualFilterChain virtualFilterChain = new VirtualFilterChain(fi, filters);
virtualFilterChain.doFilter(fi.getRequest(), fi.getResponse());
}
我的理解是,如果我在 web.xml 中定义与 Spring 无关的自定义过滤器,它们将包含在传递给 FilterChainProxy 的 FilterChain 对象中(我知道这是通过 DelegatingFilterProxy 发生的)。对吗?
我认为当 web.xml 中定义了非弹簧过滤器并且应用程序上下文中没有定义过滤器时,IF 块会被执行。
这里的 VirtualFilterChain 满足应用程序文本中定义的过滤器。
If 块中有一个 return 语句可以防止 VirtualFilterChain 部分被执行。
但这如何处理 web.xml 中定义的过滤器和应用程序上下文中定义的过滤器?
【问题讨论】:
标签: spring spring-mvc spring-security