过滤器的执行顺序

发布于:2025-03-23 ⋅ 阅读:(36) ⋅ 点赞:(0)

Servlet 过滤器(Filter)的执行顺序

在 Java Web 开发中,多个过滤器(Filter) 可以按照一定的顺序执行,通常由 @WebFilter 注解的 orderweb.xml 配置的 filter-mapping 来控制。

1. 过滤器执行的基本流程

当客户端请求到达服务器时:

  1. 所有匹配的过滤器 会按照优先级依次执行 doFilter() 方法。

  2. 过滤器可以修改请求或响应(如权限验证、日志记录等)。

  3. 调用 chain.doFilter(request, response); 后,请求会继续传递给下一个过滤器或最终的 Servlet 处理。

  4. 当 Servlet 处理完毕后,响应会依次回溯经过过滤器链(执行 doFilter() 方法中的 response 处理部分)。

2. 过滤器的默认执行顺序

如果没有特殊指定,过滤器的执行顺序如下:

  • 按照 @WebFilterweb.xml 配置的顺序执行(从上到下)。

  • 先执行 doFilter(request, response) 之前的代码

  • 请求传递到目标 Servlet 或下一个过滤器

  • Servlet 处理完成后,返回响应时,按照 "栈" 的方式依次执行 doFilter() 之后的代码(即 后进先出)。

示例

假设有 FilterAFilterBFilterC,它们的顺序为:

  1. FilterA

  2. FilterB

  3. FilterC

  4. Servlet 处理请求

  5. 响应回溯FilterC -> FilterB -> FilterA

FilterA → FilterB → FilterC → Servlet 处理 → FilterC 回溯 → FilterB 回溯 → FilterA 回溯

3. 如何控制多个过滤器的执行顺序?

(1)@WebFilter + @Order 控制

在 Spring Boot Servlet 3.0+ 的环境下,可以使用 @Order 注解 来控制执行顺序:

@Order(1)  // 数字越小,优先级越高,最先执行
@WebFilter("/admin/*")
public class AuthFilter implements Filter {
    // 过滤器代码
}
@Order(2)
@WebFilter("/*")
public class LogFilter implements Filter {
    // 记录日志
}

(2)web.xml 配置顺序

web.xml 里,filter-mapping 出现的顺序决定了执行顺序

<filter>
    <filter-name>AuthFilter</filter-name>
    <filter-class>com.example.AuthFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>AuthFilter</filter-name>
    <url-pattern>/admin/*</url-pattern>
</filter-mapping>

<filter>
    <filter-name>LogFilter</filter-name>
    <filter-class>com.example.LogFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>LogFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

在这个例子中:

  1. AuthFilter 先执行(因为它的 filter-mapping 先出现)。

  2. LogFilter 后执行