java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring Boot WebFilter 执行顺序

Spring Boot 3 中 WebFilter 的执行顺序流程分析

作者:牧云2800

Spring Boot中管理WebFilter顺序,默认为Integer.MAX_VALUE,需显式使用@Order或Ordered接口定义优先级,请求阶段按顺序值从小到大执行,响应阶段按从大到小,相同顺序值依赖Bean注册顺序,本文详细说明在Spring Boot 3中如何管理这些过滤器的执行流程,需要的朋友一起看看吧

理解并控制 WebFilter 的执行顺序对于构建可预测、行为正确的 Web 应用至关重要。 本文详细说明在 Spring Boot 3 中如何管理这些过滤器的执行流程。

1. 默认执行顺序

2. 显式控制顺序的方法

为了确保执行顺序的确定性和可预测性,Spring 提供了两种主要机制来显式定义 WebFilter 的优先级。

2.1 使用@Order注解

通过在过滤器类上添加 @Order 注解并指定一个整数值,可以清晰定义其顺序。值越小,表示优先级越高,在请求处理阶段越早执行。

import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
@Component
@Order(1) // 明确指定顺序值为1(高优先级)
public class FilterA implements WebFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        System.out.println("FilterA (Order=1) - Before Logic"); // 在执行业务逻辑前
        return chain.filter(exchange) // 将请求传递到链中的下一个过滤器或处理器
                   .then(Mono.fromRunnable(() -> 
                          System.out.println("FilterA (Order=1) - After Logic"))); // 在业务逻辑执行后和响应发送前
    }
}

2.2 实现Ordered接口

让过滤器类实现 Ordered 接口并重写 getOrder() 方法是另一种等效且常用的方式。这种方式同样遵循数值越小优先级越高的原则

import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
@Component
public class FilterB implements WebFilter, Ordered { // 同时实现WebFilter和Ordered接口
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        System.out.println("FilterB (Order=2) - Before Logic");
        return chain.filter(exchange)
                   .then(Mono.fromRunnable(() -> 
                          System.out.println("FilterB (Order=2) - After Logic")));
    }
    @Override
    public int getOrder() { // 实现Ordered接口要求的方法,返回定义的顺序值
        return 2; // 显式定义顺序值为2
    }
}

3. 执行顺序规则

Spring WebFlux 框架对 WebFilter 链的执行遵循明确的规则,区分请求处理(正向)和响应处理(反向)两个阶段:

3.1 示例输出

结合 FilterA (Order=1) 和 FilterB (Order=2) 的代码,执行流程的日志输出清晰地展示了上述规则:

FilterA (Order=1) - Before Logic  // 最高优先级(1)最先处理请求
FilterB (Order=2) - Before Logic  // 次高优先级(2)接着处理请求
... (执行业务控制器逻辑) ...          // 实际业务处理
FilterB (Order=2) - After Logic   // 次高优先级(2)最先处理响应(反向)
FilterA (Order=1) - After Logic   // 最高优先级(1)最后处理响应(反向)

4. 特殊情况:相同顺序值

5. 总结

控制方式实现示例执行顺序规则
@Order 注解@Order(1) 标注在 WebFilter 实现类上数值越小,在请求阶段越早执行
实现 Ordered 接口getOrder() 方法返回具体数值 (如 2)数值越小,在请求阶段越早执行
未指定顺序无注解或接口实现,默认 Integer.MAX_VALUE最后执行,具体顺序不稳定

最佳实践推荐:

  1. 始终显式指定顺序: 对于任何有依赖关系或执行位置要求的 WebFilter,务必使用 @Order 注解或实现 Ordered 接口来显式定义其顺序值(例如 @Order(100), @Order(200))。
  2. 规划顺序值范围: 为不同类型的过滤器预留顺序值区间(如认证用 0-99,日志用 100-199,安全后处理用 200-299),提升可读性和可维护性。
  3. 避免顺序冲突: 确保关键过滤器的顺序值唯一,防止因相同顺序值导致的不确定行为。

遵循这些实践能显著增强过滤器行为的可预测性和应用的健壮性

到此这篇关于Spring Boot 3 中 WebFilter 的执行顺序流程分析的文章就介绍到这了,更多相关Spring Boot WebFilter 执行顺序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文