一、Filter简介


      Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理。


       Filter接口中有一个doFilter方法,当开发人员编写好Filter类实现doFilter方法,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前(服务器内部对资源的访问机制决定的),都会先调用一下filter的doFilter方法。

二、例子(实现设置请求编码)

Filter类:


public class CharsetEncodingFilter implements Filter {
	
	private String endcoding; 
	
	public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		
		//设置字符集
		request.setCharacterEncoding(endcoding);
		
		//继续执行
		chain.doFilter(request, response);
		
	}

	public void init(FilterConfig filterConfig) throws ServletException {
		this.endcoding = filterConfig.getInitParameter("encoding");
		System.out.println("CharsetEncodingFilter.init()-->> endcoding=" + endcoding);
	}

}


配置XML文件:


<filter>
		<filter-name>CharsetEncodingFilter</filter-name>
		<filter-class>com.drp.util.filter.CharsetEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>GBK</param-value>
		</init-param>		
	</filter>	
	
	<filter-mapping>
		<filter-name>CharsetEncodingFilter</filter-name>
		<url-pattern>*.jsp</url-pattern>
	</filter-mapping>



这样,所有的jsp请求都会先被CharsetEncodingFilter拦截,并在请求里设置上指定的GBK编码。



三、Filter生命周期

       和Servlet一样Filter的创建和销毁也是由WEB服务器负责。不过与Servlet区别的是:1)它是在应用启动的时候就进行装载Filter类(与Servlet的load-on-startup配置效果相同)。2)容器创建好Filter对象实例后,调用init()方法。接着被Web容器保存进应用级的集合容器中去了等待着,用户访问资源。3)当用户访问的资源正好被Filter的url-pattern拦截时,容器会取出Filter类调用doFilter方法,下次或多次访问被拦截的资源时,Web容器会直接取出指定Filter对象实例调用doFilter方法(Filter对象常驻留Web容器了)。4)当应用服务被停止或重新装载了,则会执行Filter的destroy方法,Filter对象销毁。


四、注意事项

      1、Filter不仅可以通过url-pattern来指定拦截哪些url匹配的资源。而且还可以通过servlet-name来指定拦截哪个指定的servlet(专门为某个servlet服务了,servlet-name对应Servlet的相关配置)。

在web.xml文件中的声明顺序调用。