filter 请求过程中过滤链组装和调用解析
自定义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
最新文章
- 用JWT来保护我们的ASP.NET Core Web API
- RUDP之一 —— UDP VS TCP
- TCP3次握手和4次挥手
- asp.net 客户端上传文件全路径获取方法
- 没有Google的日子很难过...But you can try...
- linux中关于php和nginx用户权限的一些东西
- 数据转换错误,java.lang.NumberFormatException: null
- Hibernate3.0中的session.find()问题
- Thrift项目Server端开发流程
- Redmine(window7)安装
- sqllite中实现字符串分割
- shell脚本判断安装包位置及类型
- Altium Designer 18 ------ 常用功能记录
- WARNING: Configuration 'compile' is obsolete and has been replaced with 'implementation' and 'api'.
- Eclipse maven 错误修正方法:An error occurred while filtering resources
- C#_IO操作
- bzoj千题计划199:bzoj1055: [HAOI2008]玩具取名
- json解析为泛型对象
- oracle 判断字段相等,但类型不同引起的性能问题
- Same Tree leetcode java