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()方法,销毁过滤器: