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 对象也被销毁了。
ICP备案:
公安联网备案: