【微服务】CORS跨越问题网关请求转发时进行路径重写问题

news2025/7/16 7:10:50

一、跨域 CORS 简述

跨域官方文档: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS

浏览器跨越问题的英文简写为CORS,其出现问题的截图如下:

浏览器拒绝跨域,是通过同源策略限制的。同源策略是指,发送请求时协议、域名、端口都要相同,其中有一个不同就会产生跨域。

这种需要跨域的请求为非简单请求,在发送这种请求时,会先发送一个预检请求 OPTIONS,对非简单请求的请求流程如下图所示:

在这里插入图片描述

当我们使用微服务时,一个服务调用另一个服务的接口,这些服务部署在不同的服务器,不同的端口上,肯定会产生跨域问题。




二、解决跨域:

方法一 :使用 nginx 部署为同一个域 —— nginx 会将请求转化为同一个域

使用 nginx 是非常麻烦的,因此我们使用方法二解决跨域。

方法二: 配置当前请求容许跨域

首先,我们看一下微服务项目的一次前后端交互请求流程:

  1. 前端发请求
  2. 请求到达 GateWay 网关
  3. 网关确认是发给那个微服务后端的请求
  4. 网关转发给相应微服务后端

这样,网关在转发给指定的微服务过程中就产生了跨域。(网关的端口号和指定微服务的端口号不同)

具体解决:

为我们的网关微服务注入如下的过滤器,为所有的请求设置可以跨域,使得允许跨域

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;

@Configuration
public class MallCorsConfiguration {

    UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();


    @Bean
    public CorsWebFilter corsWebFilter(){ // 返回跨域的 Filter
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        // 配置跨越
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.setAllowCredentials(true);
        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
        return new CorsWebFilter(urlBasedCorsConfigurationSource);
    }
}




三、路径重写

使用 GateWay 网关提供的 RewritePath 方法进行路径重写,其语法为:

RewritePath=/red/?(?<segment>.*), /$\{segment}

解释:其中 red 为我们不要的路径 ,在逗号后的 /${segment} 之前 加入我们要添加的路径

例子一: 比如 RewritePath=/red/?(?<segment>.*), haha /$\{segment} 就表示:

原来为 /red/xxx 的路径 会被重写为 /haha/xxx

例子二: 比如 RewritePath=/red/?(?<segment>.*), /$\{segment} 就表示:

原来为 /red/xxx 的路径 会被重写为 /xxx

完整示例如下:
        ## 前端项目放的请求都带有 api 前缀,在后端接收时要把 api 请求去掉,加上指定的前缀
        - id: product_route
          uri: lb://mall-product  # loadbanlance 负载均衡到指定的服务
          predicates:
            - Path=/api/product/** # 指定路径下的请求都放过来
          filters:
            - RewritePath=/api/?(?<segment>.*), /$\{segment} # 路径重写


        - id: admin_route
          uri: lb://renren-fast # loadbanlance 负载均衡到指定的服务
          predicates:
            - Path=/api/**  # 指定路径下的请求都放过来
          filters:
            - RewritePath=/api/?(?<segment>.*), /renren-fast/$\{segment} # 路径重写



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/36552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文献学习03_GloVe: Global Vectors for Word Representation_20221124

论文信息 Subjects:《2014年自然语言处理经验方法会议论文集》&#xff08;EMNLP&#xff09;&#xff0c;第1532–1543页&#xff0c;2014年10月25日至29日&#xff0c; &#xff08;1&#xff09;题目&#xff1a;GloVe: Global Vectors for Word Representation &#xff0…

本地GitLab服务器搭建

一、简介 GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务。安装方法是参考GitLab在GitHub上的Wiki页面。Gitlab是被广泛使用的基于git的开源代码管理平台, 基于Ruby on Rails构建, 主要针对软件开发过…

把握性能测试重点,5步解决问题!

一、引言 很多做性能测试的同学都问过我这样一个问题&#xff1a;鱼哥(Carl_奕然)&#xff0c;你说性能测试的重点是什么? 我的回答很简单&#xff1a;瓶颈分析与问题定位。 在性能项目的整个周期&#xff0c;不管是脚本设计&#xff0c;脚本编写还是脚本执行&#xff0c;都…

什么时候可以用到强化学习?强化学习怎么用?

我相信很多像我一样的初学者在学习强化学习的的过程会有一种困惑&#xff1a;强化学习内容搞懂了&#xff0c;算法流程也明白了&#xff0c;但是怎么用在自己的研究领域或者应用上呢&#xff1f;换句话说&#xff0c;什么样的情况可以用强化学习解决呢&#xff1f; 什么是强化…

基于MxNet实现目标检测-CenterNet【附部分源码及模型】

文章目录前言目标检测发展史及意义一、数据集的准备1.标注工具的安装2.数据集的准备3.标注数据4.解释xml文件的内容二、网络结构的介绍三、代码实现0.工程目录结构如下1.导入库2.配置GPU/CPU环境3.数据加载器4.模型构建5.模型训练1.学习率设置2.优化器设置3.损失设置4.循环训练…

24.java- File类的常用方法:遍历目录里的文件

遍历目录 通过遍历目录可以在指定的目录中查找文件&#xff0c;或者显示所有的文件列表。 1.File 类的 list() File 类的 list() 方法提供了遍历目录功能&#xff0c;该方法有如下两种重载形式。 String[] list() 该方法表示返回由 File 对象表示目录中所有文件和子目录名称…

Hive之内部表外部表和分区表分桶表

Hive系列 第七章 内部表外部表和分区表分桶表 7.1 内部表和外部表 7.1.1 内部表和外部表的区别 1、创建的时候外部表加上external 2、删除表的时候&#xff0c;内部表会删除元数据信息和真实数据信息&#xff0c;外部表只会删除描述信息7.1.2 内部表和外部表的应用场景 1、…

【JAVA高级】——Druid连接池和Apache的DBUtils使用

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;JAVA开发者…

HBase查询一张表的数据条数的方法

HBase查询一张表的数据条数的方法 文章目录HBase查询一张表的数据条数的方法0、写在前面1、HBase-Shell的count命令2、Scan操作获取数据条数3、执行Mapreduce任务4、Hive与HBase整合5、协处理器Coprocessor实现6、参考资料0、写在前面 Linux版本&#xff1a;Ubuntu Kylin 16.0…

国网云(华为组件)使用

一、国网云(华为组件)介绍 一、项目各项环境 各项环境的介绍 MRS-Hive:MRS支持在大数据存储量大,计算资源需要弹性扩展的场景下,用户将数据存储在OBS服务中。使用MRS集群仅做数据计算处理的存算分离模式。DWS(高斯200):云原生数据库Gauss DB(DWS)1:融合分析能力是云原…

分布式计算模型Mapreduce实践与原理剖析(二)

第二章 MapReduce核心组件实战 2.1 MapReduce中分区组件 需求&#xff1a;根据单词的长度给单词出现的次数的结果存储到不同文件中&#xff0c;以便于在快速查询 思路&#xff1a; 1、定义Mapper逻辑 2、定义Reducer逻辑 3、自定义分区Partitioner这个案例主要的逻辑在这个…

【kafka】一、kafka介绍

kafka概述 定义 kafka是一个分布式的基于发布/订阅模式的消息队列&#xff0c;主要应用于大数据实时处理领域。 消息队列 1&#xff09;解耦 允许你独立的扩展或修改两边的处理过程&#xff0c;只要确保它们遵守同样的接口约束。 2&#xff09;可恢复性 系统的一部分组件…

java EE初阶 —进程与线程的区别

文章目录1.为什么会引入进程和线程的概念2.进程和线程的关系2.1 坤坤吃鸡演示进程和线程区别2.1.1 线程的安全问题2.1.2 线程的异常问题1.为什么会引入进程和线程的概念 引入进程这个概念&#xff0c;最主要的目的是为了解决并发编程这样的问题。 CPU 已经进入了多核心的时代&…

【Keil】编译选项设置 Warning 为 error

死亡是一座永恒的灯塔&#xff0c;不管你驶向何方&#xff0c;最终都会朝它转。一切都将逝去&#xff0c;只有死神永生。 – 刘慈欣-《三体》 前言 众所周知&#xff0c;一般而言&#xff0c;编译程序过程中的 warning 警告并不会影响可执行文件的生成&#xff0c;只有 error …

JVM 垃圾回收器分类

目录 Serial收集器 Parnew收集器 Parallel Scavenge CMS收集器 G1收集器 Serial收集器 基本概念&#xff1a;Serial收集器是最基本、发展历史最久的收集器&#xff0c;这个收集器是采用复制算法的单线程的收集器。 重点&#xff1a;其采用复制算法和单线程。 单线程的收集…

01_SpringBoot简介及项目搭建

文章目录SpringBoot简介及项目搭建0x01_SpringBoot简介Spring优缺点springboot启动器0x02_Spring boot项目搭建方式1启动类和启动器的区别0x03_Spring boot项目搭建方式20x04_Spring boot项目搭建方式3&#xff08;最推荐&#xff09;SpringBoot简介及项目搭建 欢迎关注公众号…

MYSQL 数据库企业级架构演变史

从初级架构到中级架构原来有这么多次的升级&#xff0c;并且每一次的进阶都有其优缺点&#xff0c;文末还有对高级结构的理解&#xff0c;欢迎大家在评论区各抒己见&#xff5e; MySQL简介 MySQL 是一个关系型数据库管理系统&#xff0c;由瑞典 MySQL AB公 司开发&#xff0c;…

【强化学习论文合集】AAAI-2021 强化学习论文

强化学习&#xff08;Reinforcement Learning, RL&#xff09;&#xff0c;又称再励学习、评价学习或增强学习&#xff0c;是机器学习的范式和方法论之一&#xff0c;用于描述和解决智能体&#xff08;agent&#xff09;在与环境的交互过程中通过学习策略以达成回报最大化或实现…

九、【React基础】组件的生命周期

文章目录1、旧生命周期1.1、单组件生命周期1.1.1、生命周期1.1.1.1、初始化阶段&#xff1a;由 ReactDOM.render() 触发---初次渲染1.1.1.2、更新阶段&#xff1a;由组件内部 this.setSate() 或父组件重新render触发1.1.1.3、卸载组件&#xff1a;由 ReactDOM.unmountComponent…

流媒体传输 - RTP 荷载 H264

H264 码流结构 H264 码流是由很多 NAL Unit 组成&#xff0c;所有 NAL Unit 均存在一个八位数据的 NAL Unit Header &#xff0c;这八位数据也充当此 RTP 有效负载格式的有效负载头。一个 NAL Unit Header 的语法如下: ---------------|0|1|2|3|4|5|6|7|--------|F|NRI| Type…