首页 > 编程笔记 > Java笔记 阅读:13

Java Filter的生命周期(附带实例)

Filter 对象是由服务器端创建的,其生命周期相关的方法也是由服务器端在特定场合下进行调用的。

回顾 Servlet 的生命周期,Servlet 默认在第一次接收请求的时候创建,也可以通过 <load-on-startup> 标签配置 Servlet 在服务器端启动时创建,然后通过 init() 方法初始化、service() 方法处理请求,最后 Servlet 会在服务器端关闭或将项目从服务器端上移除时销毁。

Filter 生命周期与其类似,分为创建、执行和销毁三个阶段。但 Filter 对象是在 Web 服务器端启动时直接被创建的,无须手动设置。
  1. 创建阶段:Web服务器端启动时,会创建 Filter 实例对象,并调用 init() 方法,完成对象的初始化。
  2. 执行阶段:当客户端请求目标资源时,服务器端会筛选出符合映射条件的 Filter,并按照 web.xml 文件中配置的先后顺序,依次执行 doFilter() 方法。
  3. 销毁阶段:服务器端关闭时,Web 服务器端会调用 destroy() 方法来销毁 Filter 对象。

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 对象也被销毁了。

相关文章