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,学明白响应式编程