带有 Webflux 的 Spring Boot:请求的资源上不存在“Access-Control-Allow-Origin”标头

Posted

技术标签:

【中文标题】带有 Webflux 的 Spring Boot:请求的资源上不存在“Access-Control-Allow-Origin”标头【英文标题】:Spring Boot with Webflux: No 'Access-Control-Allow-Origin' header is present on the requested resource 【发布时间】:2020-05-14 05:59:44 【问题描述】:

我尝试构建一个 Spring Boot 后端并将我的 React 前端与它连接起来。在我的本地部署中,我的 API 请求失败,因为 localhost:3000 不支持 CrossOrigin。 我在 Spring Boot 中插入了“CORSGlobalConfig”:

@Configuration
@EnableWebFlux
public class CorsGlobalConfig implements WebFluxConfigurer 
    @Override
    public void addCorsMappings(CorsRegistry corsRegistry) 
        corsRegistry.addMapping("/**")
                .allowedOrigins("http://localhost:3000")
                .allowedMethods("PUT","POST","GET");
    

在我看来,这应该可以正常工作,但有些地方不对。我需要在某处实现我的配置吗? 错误如下所示:

Access to XMLHttpRequest at 'http://localhost:8080/REQUESTPATH'
from origin 'http://localhost:3000' has been blocked by CORS policy:
Response to preflight request doesn't pass access control check:
No 'Access-Control-Allow-Origin' header is present on the requested resource.

感谢您的帮助!

【问题讨论】:

【参考方案1】:

如果您使用的是 Spring Securuty,请查看其 cors 配置。类似于 bnexd 的建议,但原生注入到安全过滤器链中

@Bean
public SecurityWebFilterChain securityFilterChain(ServerHttpSecurity http) 
    return http
        .cors().configurationSource(createCorsConfigSource()).and()
        // your security rules
        .build();


public CorsConfigurationSource createCorsConfigSource() 
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    config.addAllowedOrigin("http://localhost:3000");
    config.addAllowedMethod("OPTIONS");
    config.addAllowedMethod("GET");
    config.addAllowedMethod("PUT");
    config.addAllowedMethod("POST");
    config.addAllowedMethod("DELETE");

    source.registerCorsConfiguration("/**", config);
    return source;

【讨论】:

【参考方案2】:

我通过将以下 CorsConfig 添加到“com.package.project.config”来解决此问题:

@Configuration
public class CorsConfig 

    @Bean
    public CorsFilter corsFilter() 
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedOrigin("http://localhost:3000");
        config.addAllowedMethod("OPTIONS");
        config.addAllowedMethod("GET");
        config.addAllowedMethod("PUT");
        config.addAllowedMethod("POST");
        config.addAllowedMethod("DELETE");

        source.registerCorsConfiguration("/api/v2/**", config);
        return new CorsFilter(source);
    


还为“Access-Control-Allow-Headers”、“Access-Control-Allow-Methods”和“Access-Control-Allow-Origin”添加过滤器(在“com.package.project.filter”处)。他们都是这样建立起来的:

@Component
public class AddControlHeaderWebFilter implements WebFilter 

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) 
        exchange.getResponse()
                .getHeaders()
                .add("Access-Control-Allow-Headers", "*");
        return chain.filter(exchange);
    

希望这可以帮助遇到同样问题的人!

来源:https://www.baeldung.com/spring-response-header 配置来源:https://github.com/szerhusenBC/jwt-spring-security-demo

【讨论】:

【参考方案3】:

通常,我认为您的配置没有问题。

但您可以添加选项 OPTIONS。

.allowedMethods("PUT","POST","GET" "OPTIONS");

【讨论】:

我之前用“OPTIONS”尝试过,但没有任何反应。当我禁止“GET”时,它将不起作用,而当我允许“GET”时,它会接收数据。这只是在我想“POST”或“PUT”时发生。我不确定为什么会这样。不过感谢您的帮助! 您一直在尝试删除 allowedMethods。 没有变化...我不认为我们的逻辑失败了。

以上是关于带有 Webflux 的 Spring Boot:请求的资源上不存在“Access-Control-Allow-Origin”标头的主要内容,如果未能解决你的问题,请参考以下文章

带有 Webflux 的 Spring Boot:请求的资源上不存在“Access-Control-Allow-Origin”标头

Kotlin Spring Boot Webflux 使用 @Valid 注解验证 @RequestBody

将错误消息从 SSE (Webflux) Spring Boot 应用程序传递到 Angular 7 前端

WebFilter bean 在安全的 Spring Boot Webflux 应用程序中调用了两次

如何在 Spring Boot WebFlux 上使用 AWS X-Ray 跟踪传入请求?

Spring Webflux 功能数据库更新不起作用