Filter如何工作

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

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

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对象的引用

Filter执行时序图

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏木木玲

Netty 源码解析 ——— AdaptiveRecvByteBufAllocator

35620
来自专栏编码小白

ofbiz中FreeMarkerWorker的makeConfiguration方法

            这个方法是说明了为什么在ftl中可以使用一些java方法             1.代码展示 public static Confi...

38070
来自专栏Java架构沉思录

责任链模式实现的三种方式

责任链模式的定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系, 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为...

17810
来自专栏闵开慧

hadoop压缩与解压

1 压缩 一般来说,计算机处理的数据都存在一些冗余度,同时数据中间,尤其是相邻数据间存在着相关性,所以可以通过一些有别于原始编码的特殊编码方式来保存数据, 使数...

42980
来自专栏進无尽的文章

简述OC语言

对于一门语言的学习是需要时间领悟的,而对于一些原理性的问题,我们需要清楚其核心思想,知其然而知其所以然,这样才能有利于自己的后续发展。本文只是简述,没有面面具到...

24020
来自专栏逆向技术

16位汇编第六讲汇编指令详解第二讲

              16位汇编第六讲汇编指令详解第二讲 1.比较指令   CMP指令   1.CMP指令是将目的操作数减去源操作数,按照定义相应的设置状...

21450
来自专栏LinXunFeng的专栏

打造Moya便捷解析库,提供RxSwift拓展

13730
来自专栏我有一个梦想

QT Creator 快速入门教程 读书笔记(三)

一   信号和槽   GUI 程序除了要绘制控件,还要响应系统和用户事件,例如重绘、绘制完成、点击鼠标、敲击键盘等。当事件发生时,UI 会产生相应的变化,让用户...

29880
来自专栏极客猴

Django 学习笔记之模型高级用法(上)

前面有两篇文章简单介绍 Django 的模型,这一部分算是基础知识。我自己近期也总做了下总结,将花大概两篇的篇幅来分享下模型的一些高级用法。

7930
来自专栏Java 源码分析

Java之StringBuffer

1.存储: append(data) 添加在最后 insert(index,data) 在制定位置添加2.删除: delete(start,end) 删除...

33260

扫码关注云+社区

领取腾讯云代金券