调试tomcat的过滤器配置

javax.servlet.FilterChain的实现类在tomcat只有一个,那就是org.apache.catalina.core.ApplicationFilterChain

这个FilterChain内部具有ApplicationFilterConfig类型的数组用来存放过滤器链的配置,实际的过滤器对象就放在ApplicationFilterConfig类的实例里面。

当创建这个FilterChain的时候,其实在加载web.xml文件的时候,就已经创建好Filter了,在这里,其实是根据Request的请求路径,组装到FilterChain里面。

StandardWrapperValve和ApplicationDispatcher这两个类会创建FilterChain,这里两个类都在invoke方法调用了FilterChain的doFilter方法,只是一个是公有方法,一个是私有方法。


创建FilterChain需要借助ApplicationFilterFactory,这个静态方法工厂,然后调用createFilterChain方法。

这里有个疑问,为何调用getInstance方法没有加锁,这里如何判定一定是线程安全的?

createFilterChain方法其实只是做一件事,把匹配当前路径的FilterConfig加入到FilterChain然后返回这个新创建的FilterChain即可。


获得创建好的FilterChain,后续只需要调用其doFilter方法即可,不在赘述。

原文地址:https://www.cnblogs.com/weiguangyue/p/10929612.html