Spring WebFlux中如何为WebFilter指定生效的访问路径
方案1:Filter内部做路径匹配(适配注解式Controller场景,改动最小)
Spring WebFlux没有和Servlet体系中FilterRegistrationBean完全对等的全局路径配置机制,最简单的实现是直接在WebFilter内部通过官方提供的PathPatternParser做路径匹配判断:
@Component public class RequestIdFilter implements WebFilter { private final List<PathPattern> validPathPatterns; // 也可以把路径配置放到配置文件,通过@Value注入,不用硬编码 public RequestIdFilter() { PathPatternParser patternParser = new PathPatternParser(); validPathPatterns = List.of( patternParser.parse("/v1/**"), patternParser.parse("/v2/**") ); } @Override public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) { PathContainer requestPath = exchange.getRequest().getPath().pathWithinApplication(); // 只有匹配到指定路径才执行自定义逻辑 boolean needProcess = validPathPatterns.stream() .anyMatch(pattern -> pattern.matches(requestPath)); if (needProcess) { // 你的原有过滤器逻辑写在这里 } return chain.filter(exchange); } }
方案2:路由绑定Filter(适配函数式路由场景)
如果你用的是WebFlux的函数式路由写法,可以直接把Filter绑定到对应路径的路由分组上,不需要做额外的路径判断:
@Configuration public class WebRouterConfig { @Bean public RouterFunction<ServerResponse> apiRouter(RequestIdFilter requestIdFilter, ApiHandler apiHandler) { return RouterFunctions.route() // 绑定v1路径组的过滤器 .path("/v1", v1Builder -> v1Builder .filter(requestIdFilter) .GET("/info", apiHandler::getV1Info) // 其他v1接口定义 ) // 绑定v2路径组的过滤器 .path("/v2", v2Builder -> v2Builder .filter(requestIdFilter) .GET("/info", apiHandler::getV2Info) // 其他v2接口定义 ) .build(); } }
注意事项
WebFlux使用的PathPattern语法和Servlet中的路径匹配规则略有不同:/**匹配所有层级的子路径,/*仅匹配单层级路径,配置规则时注意根据实际需求选择通配符。
内容的提问来源于stack exchange,提问作者Ilya Y
相关产品推荐
相关产品推荐

