servlet 过滤器能够灵活地在请求与响应的传输过程中进行动态拦截,并对其中的数据内容执行处理、增强或监控等操作。
1、 Servlet 过滤器的核心处理机制
2、 过滤器是实现了 javax.servlet.Filter 接口的 Java 类,该接口共包含三个关键方法:init()、doFilter() 和 destroy()。它们分别用于过滤器的初始化、请求/响应链中的核心拦截与处理、以及资源释放。通过这些方法,可在请求抵达目标资源前实施预处理(如权限校验、编码设置),也可在响应返回客户端前执行后置操作(如日志记录、内容压缩),从而实现对 Web 应用中请求与响应流程的集中式管控。

3、 过滤器初始化参数的配置方式
4、 Filter 的 init() 方法会接收一个 FilterConfig 类型的对象,该对象封装了在部署描述文件中为该过滤器定义的所有初始化参数,可用于动态配置过滤行为。
5、 对应的 web.xml 配置示例如下:

6、 在 init() 方法内部,可通过 FilterConfig 实例调用 getInitParameter() 等方法获取已声明的参数值,实现运行时配置驱动逻辑。

7、 Servlet 过滤器的实际应用场景示例
8、 下面是一个基础但典型的过滤器实现——DisplayHeaderFilter,其作用是在每次请求处理前后打印网站名称及访问地址。该案例有助于理解过滤器的基本结构与生命周期,也为构建更高级功能(如安全控制、性能监控)提供了可扩展的基础框架。

9、 以 DisplayHeader.java 所对应的过滤器类为例展开说明。

10、 在 web.xml 中需配置 filter-mapping 节点,明确指定该过滤器所作用的目标路径或 Servlet 名称,从而控制其生效范围,确保仅对匹配的请求触发拦截逻辑。
11、 配置过滤器时,需在 web.xml 中依次定义 <filter></filter> 和 <filter-mapping></filter-mapping> 元素。前者声明过滤器类及其初始化参数,后者将其绑定至特定 URL 模式或 Servlet 名称。此过程与 Servlet 的注册和映射方式高度相似,均依赖于部署描述符中的 XML 声明完成功能挂载。

12、 当前配置使用通配符 /*,表示该过滤器将应用于所有进入容器的请求。若只需作用于部分资源,可将 url-pattern 修改为具体路径(如 /admin/* 或 /login),从而提升过滤精度,减少不必要的性能开销。
13、 启动应用后,任意访问任一受管 Servlet 即可观察到过滤器的日志输出效果。此外,还可集成 Log4J 或 SLF4J 等日志框架,将相关信息写入独立日志文件,便于后期审计与问题追踪。
14、 访问 https://www.php.cn/link/5142c1f8e73246d68fbff264ad53e738 页面后,在控制台可见如下输出结果:

15、 多个过滤器协同工作的模式
16、 Web 应用支持同时部署多个过滤器,例如 AuthenFilter(负责身份认证)与 LogFilter(负责请求日志记录)。二者通过合理的映射配置共同参与请求处理链,按既定顺序依次执行,形成分层处理机制,保障职责清晰、逻辑解耦。

17、 过滤器执行顺序的控制原理
18、 在 web.xml 中,多个 <filter-mapping></filter-mapping> 元素的书写顺序直接决定了它们在请求处理链中的调用次序。调整这些节点的位置即可改变过滤器的执行优先级,无需修改代码即可灵活适配不同业务场景下的拦截策略。
19、 如上图所示,默认情况下 LogFilter 先于 AuthenFilter 执行;而下图则通过交换 mapping 位置实现了执行顺序反转。

20、 web.xml 中各关键节点的功能详解
21、 用于定义具备条件筛选能力的过滤组件。
22、 <filter-name></filter-name> 标签用于唯一标识一个过滤器,其值不能为空,且在整个应用中必须保持唯一性。
23、 <filter-class></filter-class> 元素用于指定过滤器的具体实现类全限定名。
24、 <init-param></init-param> 用于配置过滤器启动时所需的初始参数;其中 <param-name></param-name> 表示参数键名,<param-value></param-value> 表示对应参数值。
25、 利用 FilterConfig 接口提供的 API,可在过滤器生命周期内读取并使用上述初始化参数,支撑差异化行为配置。
26、 <filter-mapping></filter-mapping> 元素用于设定过滤器的作用范围,支持两种匹配方式:一是通过 <servlet-name></servlet-name> 关联已有 Servlet,二是通过 <url-pattern></url-pattern> 设置路径规则,从而精准控制哪些请求需经过该过滤器处理。
27、 <filter-name></filter-name> 子元素用于引用已在 <filter></filter> 中声明的过滤器名称,其值必须与之完全一致,否则配置无效。
28、 <url-pattern></url-pattern> 定义过滤器所监听的请求路径模板,支持精确匹配与通配符匹配(如 /api/*、*.jsp)。
29、 <servlet-name></servlet-name> 指定该过滤器仅对指定名称的 Servlet 生效,适用于细粒度资源控制。
30、 <dispatcher></dispatcher> 元素用于限定过滤器在何种请求分发方式下被激活,可选值包括 REQUEST(默认)、INCLUDE、FORWARD 和 ERROR。允许为同一过滤器配置多个 <dispatcher></dispatcher>,使其覆盖多种调用上下文,显著增强适用性与灵活性。
31、 各 <dispatcher></dispatcher> 取值的具体语义说明
32、 REQUEST:仅当用户直接发起 HTTP 请求时触发过滤器;若目标资源是通过 RequestDispatcher 的 include() 或 forward() 方法间接调用,则不会激活该过滤器。
33、 INCLUDE:仅在目标资源被其他资源通过 include() 方法嵌入时才执行过滤器逻辑,其余情形不生效。
34、 FORWARD:仅当请求经由 forward() 方法转发至目标资源时启用过滤器,其他访问途径均忽略。
35、 ERROR:仅在发生未捕获异常并进入错误页面处理流程(如配置了 <error-page></error-page>)时激活过滤器。










