Spring Webflux WebFilterChain中的URL模式过滤

Posted

技术标签:

【中文标题】Spring Webflux WebFilterChain中的URL模式过滤【英文标题】:URL Pattern filtering in Spring Webflux WebFilterChain 【发布时间】:2019-10-25 05:29:47 【问题描述】:

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

FilterRegistrationBean.addUrlPatterns("/protected/*");

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

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

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

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

【问题讨论】:

【参考方案1】:

Webflux 和 Spring MVC 并不相同,因此您不能期望两个库中的功能相同。

如果您查看 webflux 中的 CorsWebFilter 类,您会看到他们已经实现了自己注册的路径。

他们在UrlBasedCorsConfigurationSource 中设置路径,然后在其中使用PathPatternParser 将配置注册到每个路径。

/**
 * Register a @link CorsConfiguration for the specified path pattern.
 */
public void registerCorsConfiguration(String path, CorsConfiguration config) 
    this.corsConfigurations.put(this.patternParser.parse(path), config);

注册一个 cors 过滤器:

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

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

    return new CorsWebFilter(source);

所以您要查找的内容并不具体存在,但查看 Spring 代码您可以看到他们在做什么并构建适合您需要的类似内容。

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

【讨论】:

感谢您的回答。我会试试这个。另外,我赞成你的回答。我想再等一段时间,看看其他人有没有其他办法,然后再决定接受答案。 看起来这个领域出现了一些新东西 - baeldung.com/spring-5-mvc-url-matching。 “Spring 5.0 版本添加了一个非常易于使用的 URI 变量语法:*foo 以在模式末尾捕获任意数量的路径段。”

以上是关于Spring Webflux WebFilterChain中的URL模式过滤的主要内容,如果未能解决你的问题,请参考以下文章

Spring Webflux - 03 Webflux编程模型

Spring-WebFlux使用,一文带你从0开始学明白Spring-WebFlux,学明白响应式编程

Spring WebFlux

Spring @Async 与 Spring WebFlux

深入剖析 Spring WebFlux

Spring 5 之 WebFlux 开发反应式 Web 应用