Spring Webflux WebFilterChain 中的 URL 模式过滤

Shr*_*ath 5 java spring-security spring-boot spring-webflux spring-filter

我正在尝试在 Spring Webflux 中编写一个过滤器,但无法找到仅将过滤器应用于某些 URL 模式的选项。在 Spring MVC 世界中,这可以通过使用来实现

FilterRegistrationBean.addUrlPatterns("/protected/*");
Run Code Online (Sandbox Code Playgroud)

但我无法在 webflux 世界中找到它的等价物。

作为解决方法,我使用以下方法,但这显然不是正确的方法

String path = serverWebExchange.getRequest().getURI().getPath();
if(path.contains("/protected/"))
<do-something>
Run Code Online (Sandbox Code Playgroud)

是否有任何 Spring Webflux 本机 URL 模式匹配方法WebFilterChain可以用来将过滤器仅应用于一组特定的 URL?谢谢 !

Tho*_*olf 4

Webflux 和 Spring MVC 不一样,因此您不能指望这两个库具有相同的功能。

如果你调查CorsWebFilterwebflux 中的类,你会发现他们已经实现了注册自己的路径。

他们在 a 中设置一个路径UrlBasedCorsConfigurationSource,然后在其中使用 aPathPatternParser来注册每个路径的配置。

/**
 * Register a {@link CorsConfiguration} for the specified path pattern.
 */
public void registerCorsConfiguration(String path, CorsConfiguration config) {
    this.corsConfigurations.put(this.patternParser.parse(path), config);
}
Run Code Online (Sandbox Code Playgroud)

注册 cors 过滤器:

@Bean
public CorsWebFilter corsWebFilter() {
    final CorsConfiguration config = new CorsConfiguration();

    final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", config);

    return new CorsWebFilter(source);
}
Run Code Online (Sandbox Code Playgroud)

所以你正在寻找的东西并不具体存在,但是通过查看 Spring 代码,你可以看到他们在做什么,并构建一些类似的东西来满足你的需要。

Routerfunction::filter另一种选择是仅将过滤器注册到您希望其在使用和实现时处于活动状态的端点HandlerFilterFunction