搜索
您的当前位置:首页正文

Filter如何工作。

来源:步旅网

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类中的三个接口方法。

  •     init(FilterConfig):初始化接口,在用户自定义的Filter初始化时被调用,他与Servlet的init方法的作用是一样的,FilterConfig与ServletConfig也类似,除了都能取到容器的环境类ServletContext对象之外,还能获取在<filter>下配置的<init-param>参数值。
  •     doFilter(ServletRequest, ServletResponse, FilterChain):在每个用户的请求进来时这个方法都会被调用,并在Servlet的service方法之前被调用。而FilterChain就代表当前的整个请求链,所以通过调用FilterChain.doFilter可以将请求继续传递下去。如果想拦截这个请求,可以不调用FilterChain.doFilter,那么这个请求就直接返回了。所以Filter是一种责任链设计模式。
  •     destroy:当Filter对象被销毁时,这个方法被调用。注意,当Web容器调用这个方法之后,容器会再调用一次doFilter方法。

Filter类的核心还是传递的FilterChain对象,这个对象保存了到最终Servlet对象的所有Filter对象,这些对象都保存在ApplicationFilterChain对象的filters数组中。在FilterChain链上每执行一个Filter对象,数组的当前计数都会加1,直到计数等于数组的长度,当FilterChain上所有的Filter对象执行完成后,就会执行最终的Servlet。所以在ApplicationFilterChain对象中会持有Servlet对象的引用。下图是Filter对象的执行时序图。

Filter存在的意义就好比是你要去北京,他是你的目的地,但是提供一个机制让你在去的途中可以做一些拦截工作,如可以将你的一些行李包存放在某个“存放处”,当你返回时你可以再从这个地方取回。总之他可以在你的途中增加一些东西,或者减少一些东西。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top