原理:在WEB服务器和资源(servlet、html、jsp...)中间会有一道或几道墙。这些墙就是一个个的过滤器。每当用户请求获得资源是,都要经过这些墙进预处理。再会访问资源。访问资源之后,返回响应时,响应也要被这些墙过滤。
这些过滤器靠的是一个Filter接口,这个接口没有实现类。所以我们要用过滤器就必须自己去实现这个接口。这个接口有三个方法:
init(FilterConfigfilterConfig) :初始化过滤器
doFilter(ServletRequestrequest, ServletResponse response, FilterChain chain) :Filtersperform filtering in the doFilter method.执行过滤的真正的方法,可以在这个方法里面写过滤内容。
destroy() :摧毁过滤器实例。
在doFilter方法里面,需要传一个FilterChain的类。这个类是非常重要的。过滤器往往不止有一个。而是有很多个,形成一个链式结构。当被过滤器一过滤后,有可能会被过滤器二过滤....过滤完成以后再访问资源。而FilterChain就是一个控制过滤器链的类。在api中这样解释道:
Filters use the FilterChain to invoke the nextfilter in the chain, or if the calling filter is the last filter in the chain,to invoke the resource at the end of the chain.
所以当我们在doFilter方法中写完预处理之后,需要调用FilterChain中的doFilter转到下一个链上去(如果有的话)。
当我们写完一个Filter之后,并不会立马生效。因为还没对Filter在WEB.XML中进行配置。Filter的配置方法和Servlet的配置方法大体相似。
<filter>
<filter-name>filter1</filter-name>
<filter-class>com.Filter.Filter1</filter-class>
</filter>
<filter-mapping>
<filter-name>filter1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
当然如果想在Filter里面配置参数的话可以加入此标签。使用FilterConfig对象获得参数。
<init-param></init-param>
在这里还牵扯到一个过滤器顺序的问题。如果在WEB.XML文件中 哪个<filter>标签先声明,则那个标签先过滤,返回响应时则相反。