当前位置: 首页 > 知识库问答 >
问题:

为Spring云网关配置CORS策略

鲁丰
2023-03-14

我在单独的服务器上运行Spring Cloud gateway,配置如下:

spring:
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/*]':   (I also tried '[/**]':)
            allowedOrigins: "http://localhost:3000"
            allowedMethods:
              - GET
              - POST

但每次我从React应用程序中得到:

访问位于'http://11.1.1.1:8080/api/support/tickets/create'从原点'http://localhost:3000“”已被CORS策略阻止:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“access control Allow Origin”标头。

您知道Spring Boot 2.6.2/Spring cloud 2021.0.0如何解决此问题吗?

完整代码:http://www.github.com/rcbandit111/Spring_Cloud_Gateway_POC

POST请求:

Request URL: http://1.1.1.1:8080/api/merchants/onboarding/bank_details
Referrer Policy: strict-origin-when-cross-origin
Accept: application/json, text/plain, */*
Content-Type: application/json
Referer: http://localhost:3000/
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36

Post request Payload:
{"currency":"HNL","iban":"dssvsdvsdv"}

选项请求:

Request URL: http://1.1.1.1:8080/api/merchants/onboarding/bank_details
Request Method: OPTIONS
Status Code: 403 Forbidden
Remote Address: 1.1.1.1:8080
Referrer Policy: strict-origin-when-cross-origin

答复:

HTTP/1.1 403 Forbidden
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
content-length: 0

选项请求标头:

OPTIONS /api/merchants/onboarding/bank_details HTTP/1.1
Host: 1.1.1.1:8080
Connection: keep-alive
Accept: */*
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Origin: http://localhost:3000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36
Sec-Fetch-Mode: cors
Referer: http://localhost:3000/
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9

共有3个答案

童化
2023-03-14

我有一个类似的问题,我做了以下工作:

我的申请。yml包含将CORS配置添加到每条路由的步骤:

spring:
  cloud:
    gateway:
      globalcors:
        add-to-simple-url-handler-mapping: true

然后,我配置了一个spring标准的corswebfilterbean。注意:对于生产,您不应将*用于AllowedOriginates属性。出于开发目的,这是非常好的。

@Configuration
public class CorsConfiguration extends org.springframework.web.cors.CorsConfiguration {

  @Bean
  public CorsWebFilter corsFilter() {
    org.springframework.web.cors.CorsConfiguration corsConfiguration = new org.springframework.web.cors.CorsConfiguration();
    corsConfiguration.setAllowCredentials(true);
    corsConfiguration.addAllowedOrigin("*");
    corsConfiguration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS", "HEAD"));
    corsConfiguration.addAllowedHeader("origin");
    corsConfiguration.addAllowedHeader("content-type");
    corsConfiguration.addAllowedHeader("accept");
    corsConfiguration.addAllowedHeader("authorization");
    corsConfiguration.addAllowedHeader("cookie");
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", corsConfiguration);
    return new CorsWebFilter(source);
  }
}

注意:我有版本2.3.9。spring boot和spring cloud版本的版本是Hoxton。SR10。

乜栋
2023-03-14

查看MDN Web文档中关于CORS的标题为“简单请求”的部分:

“内容类型”标题中指定的媒体类型所允许的唯一类型/子类型组合为:

  • 应用程序/x-www-form-urlencoded
  • multipart/form-data
  • 文本/纯

因为您对请求的内容类型头使用值“application/json”,所以您需要在CORS配置中允许该头:

cors-configurations:
  '[/**]':
    allowedOrigins: "http://localhost:3000"
    allowedMethods:
      - GET
      - POST
    allowedHeaders:
      - Content-Type

朱兴安
2023-03-14

您是否通过--proxy conf重定向运行FE应用程序?我不是一个精通FE的人,但不要使用changeOrigin:真的。如果您必须使用changeOrigin:true,那么它只适用于GET,对于其他人,您可能需要这样做。要使用proxy conf,我们通常有一个代理。conf.json

{
  "/api/*": {
    "target": "http://external-gateway-url",
    "secure": false,
    "logLevel": "debug"
  }
}

然后在运行应用程序时使用--proxy-configproxy.conf.json。我的FE知识已经过时了。您可能希望看起来像这样。

如果不是,并且调用是直接的,那么网关中的以下配置(代理也需要)应该可以工作:

spring:
  cloud:
    gateway:
      globalcors:
        corsConfigurations:
          '[/**]':
            allowedOrigins: "http://localhost:3000"
            allowedHeaders: "*"
            allowedMethods:
            - GET
            - POST
 类似资料:
  • 请帮忙。我正在使用Spring Cloud Gateway,我不断收到以下Cors错误: CORS策略阻止从源http://localhost:4200在http://localhost:8084/users/files处访问XMLHttpRequest:对预飞行请求的响应无法通过权限改造检查:请求的资源上不存在“访问控制-允许-源”标头。 这是我的application.yml档案

  • null 编辑1:在@SpencerGibb的帮助下,我们用HTTPS设置了spring云网关。但我们还面临一些额外的问题 如果在API网关和服务都启用了HTTPS,我们收到以下错误 javax.net.ssl.sslexception:在io.netty.handler.ssl.sslhandler.handshake(...)处握手超时(未知源)~[netyhandler-4.1.31.fin

  • 我想从前端应用程序调用POST请求,但是在控制台中我看到: CORS策略阻止从来源“http://localhost:9090/authenticate”访问位于“http://localhost:3000”的XMLHttpRequest:对飞行前请求的响应未通过访问控制检查:请求的资源上没有“access-control-allog-origin”标头。

  • 我一直在研究如何在使用Spring Cloud Gateway以及Eureka Discovery时启用CORS。 我在web上搜索了如何启用CORS,但没有结果,因为目前对此的文档非常少。我唯一能找到的是以下文档:https://cloud.spring.io/spring-cloud-gateway/single/spring-cloud-gateway.html#_header_route_

  • 我已经用Eureka发现服务实现了Spring Cloud Gateway,一切都很好,但我看到了一些我在编写URL时不知道如何处理的事情,如果我没有在URL的末尾放一个/,Gateway会直接使用其实际URL(在Eureka注册)重定向到应用程序。 例如: https://example.com/bar重定向到应用程序URL(http://example.app.url.com:8010/bar

  • 我有一个带有一些endpoint的anexo API,比如: 如何将Spring Cloud Gateway与这些endpoint一起使用?