首页 > 解决方案 > spring 中的 cors 配置有什么区别:`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("*");
        }
    };
}

带有消息:

无法处理请求 [OPTIONS http://localhost:30300/create]:响应状态 404,原因为“没有匹配的处理程序”

但这一个有效:

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

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

    return new CorsWebFilter(source);
}

为什么?有什么区别?

标签: springcorsspring-webflux

解决方案


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

在这种情况下,CORS 配置将应用于RequestMappingHandlerMappingWebFluxConfigurationSupport.

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

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


推荐阅读