在 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执行时序图