up:: 过滤器简介


一:过滤器生命周期:

沿用上篇博客的MyFirstFilter这个过滤器类:为了便于观察,init()方法和destroy()方法中添加了打印语句;

 
    package com.imooc.filter;
 
    import java.io.IOException;
 
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
 
    public class MyFristFilter implements Filter{
 
    	@Override
    	public void destroy() {
    		// 在实际项目中,销毁的目的是对执行init()方法时加载的资源;或者在doFilter()方法中产生的新的资源进
    		// 行释放,保证过滤器被销毁了之后,系统中不会有任何的残留;
    		System.out.println("destroy()方法执行了,过滤器已被销毁!");
    	}
 
    	/**
    	 * doFilter方法三个参数:ServletRequest:请求对象;ServletResponse:响应对象;FilterChain:过滤链对象
    	 */
    	@Override
    	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    			throws IOException, ServletException {
    		// TODO Auto-generated method stub
    		System.out.println("过滤器已执行");
    		chain.doFilter(request, response);  // 将请求与响应对象随着过滤链依次向后传递,如果不写这句话,请求是无法向后被正常地传递的;
 
    	}
 
    	@Override
    	public void init(FilterConfig arg0) throws ServletException {
    		// 比如加载指定的参数,从其他的文件或数据库中提取所需要的数据,这些都是init()初始化方法需要做的事情;
    		System.out.println("init()方法执行了,过滤器初始化成功!");
 
    	}
 
    }
 

启动web应用程序:执行init()方法

发现,web应用启动的时候,过滤器对象会被Tomcat自动创建,然后init()方法会被自动地执行;

但是,init()方法执行完后,并不会立即去执行doFilter()方法,因为doFilter()方法执行的时机是在每一个请求过来之后,被过滤器中的doFilter()方法拦截处理后才会执行doFilter()方法

访问Servlet,发起请求:执行doFilter()方法

关闭或重启web应用,执行destroy()方法,销毁过滤器:


二:过滤器特性: