自定义filter需要先下载依赖包
首先过滤链不是责任链的设计模式,因为一个request可以被链条上的多个filter处理。但是,对于责任链来说,一个request只能被链条中的一个handler处理。
组装过程是发生在tomcat创建HttpServletRequest、HttpServletResponse和调用servlet之间,所以不是根据每个servlet的映射url创建好对应的过滤链。
该过程主要涉及到的是一下三个类该过程主要涉及到的是以下三个类:
org.apache.catalina.core.StandardWrapperValve
org.apache.catalina.core.ApplicationFilterChain
org.apache.catalina.core.ApplicationFilterFactory
1、请求中过滤链的创建方法
StandardWrapperValve.class:96 org.apache.catalina.core.ApplicationFilterFactory#createFilterChain
2、通过debug我们可以看到从主机的上下文中获取所有过滤器的映射对象(关于tomcat的启动过程可以参考https://blog.csdn.net/yuxiangaaaaa/article/details/72867037)
3、在这一步可以看到通过获取映射对象中urlPattern去匹配该请求的路径,再去获取到相对应的filterConfig,将其添加到ApplicationFilterChain对象中,这样整个过滤链就组装完成了,至于顺序应该是在获取映射对象数据的时候就排序完成的了。
接下来就是这个过滤器数组是怎么形成套娃那样的调用方式的呢?初始的调用入口是在StandardWrapperValve.class:130
4、可以看出调用的过程是这样的:
FilterChain.doFilter->filter.doFilter->FilterChain.doFilter........
根据FilterChaind的偏移量来获取filter进行递归调用
5、到所有过滤器访问结束之后就将调用servlet的service()方法
整个请求中过滤链的组装和调用过程就是这样了。
进行springboot整合过滤器的过程中可能会遇到过滤器执行两次的问题,针对这个问题可能出现的一种原因就是因为在请求执行完之后浏览器会再发一次请求.ico的请求,具体内容可以参考:
参考地址:https://blog.csdn.net/qq_39210972/article/details/103377201
原文:https://www.cnblogs.com/qizhufeitian/p/13934776.html