微服务跨域问题踩坑(使用了renren-fast)

背景:在微服务架构的项目中,跨域问题一定是需要考虑的,所以在网关微服务上使用CorsConfiguration类来解决跨域问题,理论上这样配置完成后,应该是OK了的。

@Configuration
public class CorsConfig {
    
    @Bean
    public CorsWebFilter corsWebFilter(){
        UrlBasedCorsConfigurationSource source =
            new UrlBasedCorsConfigurationSource();
        
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        //允许任何请求头
        corsConfiguration.addAllowedHeader("*");
        //允许任何方法
        corsConfiguration.addAllowedMethod("*");
        //允许任何来源
        corsConfiguration.addAllowedOrigin("*");
        //允许凭证
        corsConfiguration.setAllowCredentials(true);
        
        
        source.registerCorsConfiguration("/**",corsConfiguration);
        
        return new CorsWebFilter(source);
    }
    
    
}

在控制台发现,请求被拦截,拦截原因是跨域。这种感觉就像刚刚的网关白配置了。
在这里插入图片描述

再来看一下消息头,
Access-Control-Allow-Credentials——访问控制允许凭据
Access-Control-Allow-Origin——访问控制允许源
这两个分别都有两个

在这里插入图片描述

在前面的配置代码中,已经是配置过了的,但为什么会出现两份呢?
在这里插入图片描述

问题源头

最后的最后,发先renren-fast微服务中,也使用了该类来解决跨域问题
在这里插入图片描述

这样重复配置会导致冲突错误

问题解决方法

既然是冲突,肯定要去掉一方的配置就行了。从设计角度上来说,最好在网关服务上来做跨域配置,因为总不能在每一个微服务上都配置一次跨域。所以直接把 renren-fast 的跨域配置直接注释掉就行了。
在这里插入图片描述

新疑问出现

之前有一个老项目,架构设计几乎和这个一样,也是网关配置了跨域,renren-fast 也配置了跨域,但这个老项目,却可以正常运行。。。

最后发现,是在renren-fast又重新自定义了一个拦截器
在这里插入图片描述

在使用此方法配置之后再使用自定义拦截器时跨域相关配置就会失效。

原因是请求经过的先后顺序问题,当请求到来时会先进入拦截器中,而不是进入Mapping映射中,所以返回的头信息中并没有配置的跨域信息。浏览器就会报跨域异常。

找到这里,真是感叹到一物降一物,你克它,它克你,最后一起克死我、、、

总结一下

  1. 微服务项目中,最后将跨域配置在网关服务上, 因为总不能在每一个微服务上都配置一次跨域
  2. 如果网关已经配置了CORS跨域,其它微服务中就不要再配置了,避免重复配置导致错误。
  3. 如果自定义拦截器的话,跨域相关配置会失效,原因是请求会先进入拦截器中。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3中解决问题,报错Access-Control-Allow-Origin的方法如下: 1. 在项目的config.js文件中添加以下配置: ```javascript proxy: { '/api': { target: 'http://localhost:8081', // 后端服务器的地址 changeOrigin: true, // 是否 ws: true, // 是否代理 websockets secure: true, // 是否https接口 pathRewrite: { '^/api': '' // 路径重置 } } } ``` 这样配置后,所有以`/api`开头的请求都会被代理到后端服务器。 2. 在Vue文件中编写请求: ```javascript created() { axios.get('api/user/findUserAll').then(function (resp) { console.log(resp) }) } ``` 这样就可以使用axios发送请求了,不再报错Access-Control-Allow-Origin。 需要注意的是,axios本质上是JavaScript的ajax封装,因此会受到同源策略的限制。为了解决问题,我们使用代理方式将请求转发到后端服务器。同时,确保后端服务器已经配置了正确的响应头,例如设置Access-Control-Allow-Origin为允许访问的名。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Vue3解决问题,报错Access-Control-Allow-Origin](https://blog.csdn.net/weixin_45425813/article/details/123911222)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [vue中axios实现数据交互与问题](https://download.csdn.net/download/weixin_38745361/14902123)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值