1.FilterChainProxy去找过滤器链去了~
FilterChain 是过滤器链,我好像之前一直说的拦截器链(尴尬)
在上一篇中,我们知道FilterChainProxy
拿到了三条过滤器链,那FilterChainProxy
如何根据请求去选择呢?
每个SecurityFilterChain都有一个RequestMatcher 匹配器,这个匹配器中可以放置多个url或者通配符表达式进行匹配,匹配成功就直接返回这个过滤器链的过滤器集合。
所以SecurityFilterChain其实也不是过滤器链的真正执行者,而是一个URL匹配器+过滤器集合存储容器的工具人。
2.VirtualFilterChain 接手SecurityFilterChain的过滤器集合
研究一下VirtualFilterChain
如何形成过滤器链,如何再返回到tomcat的过滤器链上去。毕竟如果security认证或者鉴权通过后,还是要走DispatcherServlet
的。
@Override
public void doFilter(ServletRequest request, ServletResponse response)
throws IOException, ServletException {
if (currentPosition == size) {
// 通过一个指针去遍历过滤器集合
// 当指针走到集合尾部时,security过滤器链里的过滤器执行完毕
if (logger.isDebugEnabled()) {
logger.debug(UrlUtils.buildRequestUrl(firewalledRequest)
+ " reached end of additional filter chain; proceeding with original chain");
}
// Deactivate path stripping as we exit the security filter chain
this.firewalledRequest.reset();
// 将请求和响应重新交给tomcat的过滤器链中,security的执行完毕了。
originalChain.doFilter(request, response);
} else {
currentPosition++;
// 获取security 过滤器链的下一个过滤器
Filter nextFilter = additionalFilters.get(currentPosition - 1);
if (logger.isDebugEnabled()) {
logger.debug(UrlUtils.buildRequestUrl(firewalledRequest)
+ " at position " + currentPosition + " of " + size
+ " in additional filter chain; firing Filter: '"
+ nextFilter.getClass().getSimpleName() + "'");
}
// 执行过滤器
nextFilter.doFilter(request, response, this);
}
}
上面的过程其实就是拿出配置的一个个过滤器,然后一个个去执行。
3.小结
下一篇会详细的讲解一下security默认过滤器链中的15个过滤器到底是干啥用的