首页 > 解决方案 > Java Spring Boot Webflux cors 被阻止

问题描述

我正在尝试使用 Webflux 构建一个 Angular 和 Spring Boot 应用程序,而不是一开始就被包含实体和数据库的完整 CRUD 教程所困扰,我想我会先看看我是否可以让客户端显示一个由服务器返回的字符串,正如 Spring Boot 的文档在这里所教的那样。为此,我有以下代码:

//Angular client
  private currencyGreetingUrl: string;

  constructor(private http: HttpClient) {
    this.currencyGreetingUrl = 'http://localhost:8080/currency';
  }

  public getCurrencyGreeting(): Observable<string> {
    return this.http.get<string>(this.currencyGreetingUrl);
  }

//Spring Boot Web Client
@CrossOrigin(origins = "http://localhost:4200")
public class CurrencyWebClient {
  private WebClient client = WebClient.create("http://localhost:8080");

  private Mono<ClientResponse> result = client.get()
      .uri("/currency")
      .accept(MediaType.TEXT_PLAIN)
      .exchange();
  
  public String getResult() {
    return ">> result = " + result.flatMap(res -> res.bodyToMono(String.class)).block();
  }
}

//Spring boot handler
@Component
public class CurrencyHandler {

  public Mono<ServerResponse> currency(ServerRequest request) {
    return ServerResponse.ok().contentType(MediaType.TEXT_PLAIN)
      .body(BodyInserters.fromValue("Hello, Currency On The Go!"));
  }
}

//Spring Boot router

@Configuration
public class CurrencyRouter {

  @Bean
  public RouterFunction<ServerResponse> route(CurrencyHandler currencyHandler) {

    return RouterFunctions
      .route(RequestPredicates.GET("/currency").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), currencyHandler::currency);
  }
}

但是,在运行客户端和服务器时出现此错误Access to XMLHttpRequest at 'http://localhost:8080/currency' from origin 'http://localhost:4200' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

我是 Spring Boot 新手,一直在四处寻找建议,但我通常会找到涉及配置、控制器类和其他比我目前拥有的更多构建工件的解决方案。我怎样才能让它工作?我很感激任何帮助。

标签: javaspring-bootcorsspring-webfluxspring-webclient

解决方案


您已决定使用功能端点并且您没有使用我从您的标签中可以看出的弹簧安全性,这意味着此处提供的所有其他答案都是错误的。

使用功能端点时,您必须知道您已选择不使用传统的基于注释的类。这意味着您失去了 spring 框架提供的许多免费功能

功能端点更“低级”。因此,处理 CORS 的责任落在了开发人员身上。

如果您是 Spring 和 webflux 的初学者,我不会选择这条路线。

官方 webflux 文档的 CORS 章节中的文档说明

您可以通过内置的 CorsWebFilter 应用 CORS 支持,它非常​​适合功能端点

他们甚至提供了一个标准 CORS 过滤器的实现,您可以根据自己的需要进行定制。

@Bean
CorsWebFilter corsFilter() {

    CorsConfiguration config = new CorsConfiguration();

    // Possibly...
    // config.applyPermitDefaultValues()

    config.setAllowCredentials(true);
    config.addAllowedOrigin("https://domain1.com");
    config.addAllowedHeader("*");
    config.addAllowedMethod("*");

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

    return new CorsWebFilter(source);
}

互联网上有 100 多个解释 CORS 的网页,这是 spring-boot、spring-security 标签中最常见的问题。我建议您阅读 CORS(在此处询问之前您应该这样做)。

我强烈建议您从这里开始阅读:

Mozilla CORS


推荐阅读