Filter接口的生命周期
Servlet 容器(如 Tomcat、Jetty、GlassFish 等)在启动时会加载并初始化部署在其中的 Web 应用程序。在这个过程中,它会读取 web.xml 文件(或在 Servlet 3.0+ 中使用 @WebFilter 注解)以获取 Filter 的配置信息。
以下是 Servlet 容器如何调用 Filter 的 init 方法并传递 FilterConfig 对象的简要步骤:
-
加载 Web 应用程序: Servlet 容器在启动时或当新的 Web 应用程序被部署时,会加载并解析 web.xml 文件或处理 @WebFilter 注解。
-
实例化 Filter: 对于在 web.xml 中定义的每个 Filter,Servlet 容器都会创建一个 Filter 实例。如果使用了 @WebFilter 注解,容器会使用服务提供者机制或组件扫描来找到并实例化 Filter。
-
创建 FilterConfig: Servlet 容器会创建一个 FilterConfig 对象来封装 Filter 的配置信息。这个对象包含了 Filter 的名称、初始化参数以及 ServletContext 对象(用于访问容器相关的资源)。
-
调用 init 方法: 一旦 Filter 实例被创建并且 FilterConfig 对象被准备好,Servlet 容器就会调用 Filter 的 init 方法,并将 FilterConfig 对象作为参数传递。这个调用是在 Filter 生命周期的初始化阶段发生的,只会在 Filter 第一次被加载时调用一次。
-
存储 FilterConfig: Filter 通常会将传入的 FilterConfig 对象保存在其内部状态中,以便在后续的方法调用(如 doFilter)中使用。
-
处理请求: 当客户端向 Web 应用程序发送请求时,Servlet 容器会根据 web.xml 或 @WebFilter 注解中定义的 URL 模式来决定是否应该调用某个 Filter 的 doFilter 方法。如果决定调用,容器会创建一个 Filter 链,并按照在 web.xml 或注解中定义的顺序依次调用每个 Filter 的 doFilter 方法。
-
销毁 Filter: 当 Web 应用程序被停止或重新加载时,Servlet 容器会调用 Filter 的 destroy 方法来释放任何在 Filter 中持有的资源。这是 Filter 生命周期的最后一个阶段。
请注意,这些步骤是 Servlet 规范中定义的 Filter 生命周期的一部分,并且具体的实现可能会因 Servlet 容器的不同而略有差异。但是,大多数 Servlet 容器都会遵循这些基本的步骤来加载、初始化和使用 Filter。