spring 中的 cors 配置有何不同:`CorsWebFilte`r 与 `WebFluxConfigurerComposite.addCorsMappings(CorsRegistry registry)`?

What is the difference in cors configuration in spring: `CorsWebFilte`r vs `WebFluxConfigurerComposite.addCorsMappings(CorsRegistry registry)`?

在我的具有 WebFlux 功能端点的应用程序中,此 cors 配置不起作用:

@Bean
WebFluxConfigurer corsConfigurer() {
    return new WebFluxConfigurerComposite() {

        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOrigins("*")
                    .allowedMethods("*")
                    .allowedHeaders("*");
        }
    };
}

留言:

Failed to handle request [OPTIONS http://localhost:30300/create]: Response status 404 with reason "No matching handler"

但是这个有效:

@Bean
CorsWebFilter corsFilter() {
    CorsConfiguration config = new CorsConfiguration();
    config.addAllowedOrigin("*");
    config.addAllowedHeader("*");
    config.addAllowedMethod("*");

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

    return new CorsWebFilter(source);
}

为什么?有什么区别?

WebFluxConfigurer 配置基础结构适用于 Spring WebFlux 中的注释模型和功能模型。

在这种情况下,CORS 配置应用于由 WebFluxConfigurationSupport 创建的 RequestMappingHandlerMapping bean。

另一方面,它也适用于支持功能模型的RouterFunctionMapping。但是该实现首先检查处理程序是否与传入请求匹配,然后在必要时将其作为 CORS 请求(例如,预检请求)选择性地处理。

有人可能会争辩说这是故意的,目的是使 RouterFunction 模型显式化,而不是对开发人员隐藏任何内容。 CorsWebFilter 是一种更全局的机制,无论如何可能更适合功能模型,但您仍然可以将其视为增强请求并在 https://jira.spring.io 上创建一个新问题(请这样做!)。