Java Filter的生命周期(附带实例)
Filter 对象是由服务器端创建的,其生命周期相关的方法也是由服务器端在特定场合下进行调用的。
回顾 Servlet 的生命周期,Servlet 默认在第一次接收请求的时候创建,也可以通过 <load-on-startup> 标签配置 Servlet 在服务器端启动时创建,然后通过 init() 方法初始化、service() 方法处理请求,最后 Servlet 会在服务器端关闭或将项目从服务器端上移除时销毁。
Filter 生命周期与其类似,分为创建、执行和销毁三个阶段。但 Filter 对象是在 Web 服务器端启动时直接被创建的,无须手动设置。
Filter 生命周期的相关方法如下表所示。
例如,在 FirstFilter 类中,为每一个生命周期方法添加输出语句,并运行代码,演示各个方法的执行时间。FirstFilter 类的示例代码如下:

图 1 重新启动项目,查看控制台
可以发现,此时 Filter 对象被创建并且执行初始化操作。
然后单击超链接发送请求,再次查看控制台,如下图所示:

图 2 发送请求后查看控制台
发送请求后,进入 doFilter() 方法拦截过滤,同时再次印证,请求先通过过滤器 FirstFilter 检查,放行后进入 FirstServlet 具体处理,之后再回到过滤器 FirstFilter 执行放行后的代码。
最后关闭服务器端,查看控制台,如下图所示:

图 3 关闭服务器端查看控制台
关闭服务器端,发现 FistFilter 对象也被销毁了。
回顾 Servlet 的生命周期,Servlet 默认在第一次接收请求的时候创建,也可以通过 <load-on-startup> 标签配置 Servlet 在服务器端启动时创建,然后通过 init() 方法初始化、service() 方法处理请求,最后 Servlet 会在服务器端关闭或将项目从服务器端上移除时销毁。
Filter 生命周期与其类似,分为创建、执行和销毁三个阶段。但 Filter 对象是在 Web 服务器端启动时直接被创建的,无须手动设置。
- 创建阶段:Web服务器端启动时,会创建 Filter 实例对象,并调用 init() 方法,完成对象的初始化。
- 执行阶段:当客户端请求目标资源时,服务器端会筛选出符合映射条件的 Filter,并按照 web.xml 文件中配置的先后顺序,依次执行 doFilter() 方法。
- 销毁阶段:服务器端关闭时,Web 服务器端会调用 destroy() 方法来销毁 Filter 对象。
Filter 生命周期的相关方法如下表所示。
生命周期方法 | 执行时机 | 作用 |
---|---|---|
FirstFilter() 构造器方法 | Web 应用启动时 | 用于创建 Filter 对象 |
init() 方法 | Web 应用启动时 | 用于对象初始化 |
doFilter() 方法 | 接收到匹配的请求时 | 执行拦截过滤 |
destroy() 方法 | Web 应用卸载前 | 用于销毁对象 |
例如,在 FirstFilter 类中,为每一个生命周期方法添加输出语句,并运行代码,演示各个方法的执行时间。FirstFilter 类的示例代码如下:
//注意不要导错包 import javax.servlet.*; import java.io.IOException; public class FirstFilter implements Filter { //1.创建对象 public FirstFilter() { System.out.println("FirstFilter 对象被创建了..."); } //2.对象初始化 @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("FirstFilter 对象被初始化了..."); } //3.执行拦截过滤 /* * 参数 * servletRequest 请求 * servletResponse 响应 * filterChain 用于放行 * */ @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("访问到了 FirstFilter..."); //放行(看检查结果) //原理:依次去寻找下一个过滤器,下一个没有过滤器了就直接到目标Servlet filterChain.doFilter(servletRequest,servletResponse); //放行后的代码 System.out.println("这是 FirstFilter 放行后的代码"); } //4.销毁对象 @Override public void destroy() { System.out.println("FirstFilter 对象被销毁了..."); } }启动项目,运行完代码后没有单击超拦截发送请求,查看控制台,如下图所示:

图 1 重新启动项目,查看控制台
可以发现,此时 Filter 对象被创建并且执行初始化操作。
然后单击超链接发送请求,再次查看控制台,如下图所示:

图 2 发送请求后查看控制台
发送请求后,进入 doFilter() 方法拦截过滤,同时再次印证,请求先通过过滤器 FirstFilter 检查,放行后进入 FirstServlet 具体处理,之后再回到过滤器 FirstFilter 执行放行后的代码。
最后关闭服务器端,查看控制台,如下图所示:

图 3 关闭服务器端查看控制台
关闭服务器端,发现 FistFilter 对象也被销毁了。