我在单独的服务器上运行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
我有一个类似的问题,我做了以下工作:
我的申请。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。
查看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
您是否通过--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一起使用?