Filter 底层原理(是谁调用的)

1.创建一个过滤器链,并把待执行的 servlet 对象存放到过滤器链中,从这一步可以看出,只有当请求过来,才会创建servlet,过滤器链才会将servlet add

	1. 把要执行的servlet存放到过滤器链中。
	2. 如果没有配置过滤器则return一个空的过滤器链(只包含上面设置的servlet)。
	3. 如果配置过滤器,则把所有配置的过滤器加入到过滤器链中
	4. 然后将 request传入 filter链中的第一个处理器的 handler 方法
	   判断 request 的 filter-mapping中配置的url-pattern规则,如果符合则执行 这个处理器的 doFilter方法
	如果不符合,返回事件对象,传给下一个处理器
	
	过滤器的顺序是按照web.xml中的先后顺序执行的。

2.执行doFilter方法

	1.这里,因为filter提供了开发者 filterChains,这样我们可以考虑是否要走 下一个处理器
	如果没有提供,默认是执行完,就走下一个处理器

3.filterchains.dofilter()

	1.后面还有filter,执行filter的handler方法
	2.没有执行目标资源

4.filterChains

filter 提供 责任链给开发者
			所以,每个处理器都是自己判断执行与否,不执行下一个处理器,执行
			就可以进入 暴露给你的 doFilter方法,这时你可以判断是否要 进入下一个处理器
			并且,正因为你可以写代码判断是否进入下一个处理器,这样你就可以写前置处理-->下一个处理器-->后置处理

责任链中处理器的 两种 调用方式

	1.主程序中 调用一个处理器的方法,处理完结果,返回给主程序,然后主程序在把这个结果,传给下一个 处理器执行(拦截器)
	2.主程序 调用一个处理器的方法,在这个处理器的方法中 判断是否调用下一个处理器的方法,这样始终只有一个栈(filter)
	
	3.上面这两种 主要的区别是 看 组件 是否 给你 你责任链,让你有能力判断是否执行下一个处理器的方法
	并且,如果提供你责任链,你不仅有能力决定是否,停止执行下一个处理器,同样
	正因为它 一个 栈的 调用方法,让你可以写 前置处理,和 后置处理,你可处理一半
	然后,调用下一个处理器的方法(此时这个方法还没有结束)等下一个方法执行完返回结果,你再执行 后置代码

每执行一个过滤器则把过滤器链中的post+1(下标),直到所有的过滤器的doFilter方法都调用成功,这也是过滤器链可以知道下一个过滤器是谁的原因

过滤器链中的所有过滤器的doFilter方法都执行完成后,最后再调用过滤器链中存放的servlet.service()方法,这一步是开启异步线程的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值