前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >记一个小的 SpringCloud CORS跨域问题 | 冷饭热炒

记一个小的 SpringCloud CORS跨域问题 | 冷饭热炒

作者头像
做棵大树
发布2022-09-27 20:06:33
6120
发布2022-09-27 20:06:33
举报
文章被收录于专栏:代码日志代码日志

“好久没更新了,炒个冷饭。记录下写毕设时出现的小问题吧~ 问题描述: 已拦截跨源请求:同源策略禁止读取位于 http://localhost:9015/standard-service/standard/add 的远程资源。(原因:不允许有多个 'Access-Control-Allow-Origin' CORS 头)。

在页面发起直接请求出现时上述问题:不允许多个 'Access-Control-Allow-Origin' CORS 头 出现,当时的跨域配置包含多处。

背景

项目后端使用了多个服务模块,对外通过 gateway 网关进行暴露以及请求的分发;前端在请求的时候直接请求网关接口,然后网关将请求分发到独立模块中去。

在此请求过程中,因为搬运了之前的一个模块,而后在前端请求时出现了上述问题。其中涉及到的跨域配置如下。

请求过程

gateway网关配置文件

代码语言:javascript
复制
spring:
 cloud:
        # 微服务网关
        gateway:
          discovery:
            locator:
              enabled: true                 # 开启从注册中心动态创建路由的功能,利用微服务名进行路由
              lower-case-service-id: true   # 微服务名称以小写形式呈现

          globalcors:
            cors-configurations: 
              # 全局允许访问
              '[/**]':
                allow-credentials: true
                allowed-origins:
                  - http://localhost:8080
                  - http://standard.beatree.cn
                allowed-headers: "*"
                allowed-methods:
                  - OPTIONS
                  - GET
                  - POST
                  - PUT
                  - DELETE

service功能模块全局跨域配置

CorsConfig.java

代码语言:javascript
复制
//@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Autowired
    CorsParams corsParams;

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins(corsParams.getAllowedOrigins())
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .allowCredentials(true)
                .maxAge(3600)
                .allowedHeaders("*");
    }
}
/**
 *  corsParams.getAllowedOrigins() 
 */

application.yml

代码语言:javascript
复制
cros:
  allowedOrigins:
    - http://api.beatree.cn
    - http://localhost:8080

拦截浏览器中的前端请求后,可以看到响应头中的 Access-Control-Allow-OriginAccess-Control-Allow-Credentials 出现了两次,而理论上,他们应该仅出现一次就可以。

问题现象

大胆猜一下,应该是请求被跨域配置连续拦截了两次,因此返回了两个'Access-Control-Allow-Origin' CORS 头,所以我们尝试去掉一个就可以了~

试了试还真是这样,解决方案放下边了。

解决方案

问题: 如上,出现了重复配置的问题,当去除掉子模块中的 allowedOrigins 会出现403forbidden问题。

解决方案: 不需要通过两个模块都进行跨域的配置,可仅在 gateway 网关模块进行设计即可;从而避免重复配置产生的问题。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-06-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 做棵大树 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 解决方案
相关产品与服务
微服务引擎 TSE
微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档