继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Filter如何工作

开心每一天1111
关注TA
已关注
手记 479
粉丝 48
获赞 218

在 web.xml 文件中通过<filter>和<filter-mapping>标签组合对编写的filter类进行注册,并设置它所能拦截的资源

实际上,Filter可以完成与Serlvlet一样的工作,甚至比Servlet使用起来更加灵活,因为它除了提供了request和response对象外,还提供了一个FiterChain链对象,他可以让我们更加灵活地控制请求的流转.


5bdc12bb0001308e09740294.jpg

Filter相关的类结构图

在Tomcat中,FilterConfig和FilterChain的实现类分别是从ApplicationFilterConfig和ApplcationFIterChian,而Fitler
的实现类由用户自定义,只要实现了FIlter接口中定义的三个接口即可,这三个接口与在Servlet中的类似.只不过还有一个AlllicationFilterChain类,此类可以将多个Filter串联成链.
详细看下Filter中的三个接口方法

  • init<FilterConfig>:初始化接口,在用户自定义的Filter初始化时被调用,它与Servlet的init方法作用一致,FilterCongfig与ServletConfig也类似,除了都能取到容器的环境类ServletContext对象之外,还能获取在<filter>下配置的<init-param>参数值

  • doFilter(ServletRequest,ServResponse,FilterChain):在每个用户的请求进来时都会调用此方法,并在Servlet的service方法前被调用,而FilterChjain就代表当前的整个请求链,所以通过调用doFilter可以将请求继续传递下去.若想拦截此请求,可不调用doFilter,那么该请求就直接反悔了,所以Filter是一种责任链设计模式.

  • destroy:当Filter对象被销毁时,该方法被调用.注意:当Web容器调用该方法后,容器就会再调用一次doFilter方法.

Filter类的核心哈市传递的FilterChain对象,该对象保存了到最终Servlet对象的所有Filter对象,这些对象都保存在ApplicationFilterChain对象的filters数组中.在FilterChain链上每执行一个Filter对象,数组的当前计数加一,直到计数等于数组的长度,当FilterChain上所有的Filter对象执行完成后,就会执行最终的Servl.所以在ApplicationFilterChain对象中会持有Servle对象的引用


5bdc12bb0001fce308310622.jpg

Filter执行时序图



作者:芥末无疆sss
链接:https://www.jianshu.com/p/65fa43810ed2
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP