Spring Webflux WebFilterChain中的URL模式过滤

时间:2019-06-10 19:53:24

标签: java spring-boot spring-security spring-webflux spring-filter

我试图在Spring Webflux中编写一个过滤器,但是找不到用于仅将过滤器应用于某些URL模式的选项。在Spring MVC世界中,可以使用

$myVmss = Get-AzVmss -ResourceGroupName myRg -Name myVmss

$ipConfig = New-AzVmssIpConfig `
  -Name myNewConfig `
  -SubnetId $mySubnetId ` # replace with id of subnet
  -LoadBalancerBackendAddressPoolsId $backendPoolId # replace with id of backend pool

Add-AzVmssNetworkInterfaceConfiguration `
  -Name myNewConfig `
  -Primary $true `
  -IpConfiguration $ipConfig `
  -VirtualMachineScaleSet $myVmss `

$myVmss | Update-AzVmss

但是我在webflux世界中找不到与之等效的东西。

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

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

String path = serverWebExchange.getRequest().getURI().getPath(); if(path.contains("/protected/")) <do-something> 中是否有任何Spring Webflux本机URL模式匹配方法可用于将过滤器仅应用于一组特定的URL?谢谢!

1 个答案:

答案 0 :(得分: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时处于活动状态的端点