问题原因
跨域本质是浏览器基于同源策略的一种安全手段
同源策略(Sameoriginpolicy),是一种约定,它是浏览器最核心也最基本的安全功能
所谓同源(即指在同一个域)具有以下三个相同点
- 协议相同(protocol)
- 主机相同(host)
- 端口相同(port)
反之非同源请求,也就是协议、端口、主机其中一项不相同的时候,这时候就会产生跨域
一定要注意跨域是浏览器的限制,你用抓包工具抓取接口数据,是可以看到接口已经把数据返回回来了,只是浏览器的限制,你获取不到数据。用postman请求接口能够请求到数据。这些再次印证了跨域是浏览器的限制。
解决
方法一
在 gateay 模块的 application.properties 文件中添加
# 全局跨域配置
# 允许跨域的域名
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedOriginPatterns=*
# 允许跨域的请求头
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedHeaders=*
# 允许跨域的请求方法
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedMethods=*
# 是否允许携带cookie
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowCredentials=true
# 跨域请求检测的有效期,单位为秒
spring.cloud.gateway.globalcors.cors-configurations.[/**].maxAge=3600
方法二
在对应的 Controller 类或方法头上一行添加 @CrossOrigin