首页 > 其他 > 详细

filter 请求过程中过滤链组装和调用解析

时间:2020-11-06 09:40:00      阅读:29      评论:0      收藏:0      [点我收藏+]

自定义filter需要先下载依赖包

技术分享图片

 

首先过滤链不是责任链的设计模式,因为一个request可以被链条上的多个filter处理。但是,对于责任链来说,一个request只能被链条中的一个handler处理。

组装过程是发生在tomcat创建HttpServletRequestHttpServletResponse和调用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、到所有过滤器访问结束之后就将调用servletservice()方法

技术分享图片

 

整个请求中过滤链的组装和调用过程就是这样了。

进行springboot整合过滤器的过程中可能会遇到过滤器执行两次的问题,针对这个问题可能出现的一种原因就是因为在请求执行完之后浏览器会再发一次请求.ico的请求,具体内容可以参考:

参考地址:https://blog.csdn.net/qq_39210972/article/details/103377201

 

filter 请求过程中过滤链组装和调用解析

原文:https://www.cnblogs.com/qizhufeitian/p/13934776.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!