Filter也是在web.xml中另外一个常用的配置项,可以通过<filter>和<filter-mapping>组合来使用Filter。实际上Filter可以完成与Servlet同样的工作,甚至比Servlet使用起来更加灵活,因为他除了提供了request和response对象外,还提供了一个FilterChain对象,这个对象可以让我们更加灵活的控制请求的流转。
在Tomcat容器中,FilterConfig和FilterChain的实现类分别是ApplicationFilterConfig和ApplicationFilterChain,而Filter的实现类由用户自定义,只要实现Filter接口中定义的三个接口就行,这三个接口与在Servlet中类似。只不过还有一个ApplicationFilterChain类,这个类可以将多个Filter串联起来,组成一个链,这个链与Jetty中的Handler链有异曲同工之妙。下面详细看一下Filter类中的三个接口方法。
Filter类的核心还是传递的FilterChain对象,这个对象保存了到最终Servlet对象的所有Filter对象,这些对象都保存在ApplicationFilterChain对象的filters数组中。在FilterChain链上每执行一个Filter对象,数组的当前计数都会加1,直到计数等于数组的长度,当FilterChain上所有的Filter对象执行完成后,就会执行最终的Servlet。所以在ApplicationFilterChain对象中会持有Servlet对象的引用。下图是Filter对象的执行时序图。
Filter存在的意义就好比是你要去北京,他是你的目的地,但是提供一个机制让你在去的途中可以做一些拦截工作,如可以将你的一些行李包存放在某个“存放处”,当你返回时你可以再从这个地方取回。总之他可以在你的途中增加一些东西,或者减少一些东西。
因篇幅问题不能全部显示,请点此查看更多更全内容