Spring Webflux HandlerFilterFunction为何在路由后调用却先执行?
HandlerFilterFunction 在 coRouter 末尾调用却先执行的原因
这确实和函数式编程的组合(Composition)特性直接相关,不是表面上的调用顺序问题。
核心逻辑:RouterFunction 的嵌套包装
Spring WebFlux 中,coRouter 的链式调用本质是在构建一个嵌套的函数处理链:
- 当你定义完所有路由规则后调用
.filter(testHandlerFilter),相当于把之前整个路由链(所有路由处理器)包装成了当前过滤器的目标执行对象。 HandlerFilterFunction的设计就是在目标处理器执行前后插入逻辑,所以实际执行顺序是:先跑过滤器的校验逻辑,再把请求委托给原本的路由处理器。
简单类比理解
假设你先写了基础路由逻辑:
RouterFunction<ServerResponse> baseRouter = coRouter.route(...) .route(...) .build();
然后调用 baseRouter.filter(testHandlerFilter),得到的新 RouterFunction 执行流程是:
- 进入
testHandlerFilter的过滤逻辑 - 过滤通过后,再执行
baseRouter里的具体路由处理器
这和你在 coRouter 末尾链式调用 .filter() 是完全一样的逻辑——本质是给整个路由链套了一层前置拦截壳。
额外说明
如果需要让过滤器在特定路由处理器之后执行(这种场景极少,通常过滤器都是前置校验),你需要把 .filter() 绑定到单个路由的链式调用中,比如:
coRouter.route(RequestPredicates.GET("/quote"), quotationHandler::getQuote) .filter(postQuoteFilter) // 这个过滤器会在该路由处理器之后执行 .route(RequestPredicates.POST("/quote"), quotationHandler::postQuote) .build();
内容的提问来源于stack exchange,提问作者Bernardo Vitor
相关产品推荐
相关产品推荐

