配置网关路由及Gateway 的路径重写以及跨域访问

目录

一、现状

二、配置网关路由

 三、Gateway 的路径重写

四、跨域访问


一、现状

1.前端发送给网关:网关88端口

2.目标项目:8080端口

前端发送的请求:http://localhost:88/api/captcha.jpg

后端需接收请求:http://localhost:8080/renren-fast/captcha.jpg

发送的路径与需要路径不一样,发送请求后出现404报错找不到所需路径,所有可以通过网关的形式将转发为所需的路径

二、配置网关路由

1.目标项目和网关项目的pom文件都需要引入Nacos作为注册配置中心

<dependencys>
<!--Nacos 作为注册中心 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--Nacos 作为配置中心 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencys>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2021.1</version>
            <type>pom</type><scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

2.目标项目和网关项目application.java文件中使用 @EnableDiscoveryClient

3. 目标项目application.yml文件中配置项目名称及Nocas地址

 三、Gateway 的路径重写

1.在网关项目中的application.yml中配置路由规则,将请求重定向到指定的服务

  • id: 路由规则的唯一标识符。在这个例子中,admin_route 是这个路由规则的 ID。

  • uri: 请求重定向到的服务地址。在这个例子中,http://localhost:8080 是目标服务地址。

  • predicates: 路由断言,用于匹配请求路径。在这个例子中,只有一个断言 Path=/api/**,它匹配所有以 /api 开头的请求路径。

  • filters: 过滤器,用于对请求进行修改。在这个例子中,只有一个过滤器 RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment},它将匹配到的请求路径中的 /api/ 替换为 /renren-fast/,并且将原路径中的其他部分作为参数传递给新的路径。

spring:
  cloud:
    gateway:
      routes:
        - id: admin_route
          uri: http://localhost:8080
          predicates:
            - Path=/api/**
          filters:
            - RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment}

四、跨域访问

 发送请求是88端口,接收的是8080,会因为CORS策列(同源策略)出现跨域禁止访问问题

跨域具体官方文档介绍

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORSicon-default.png?t=N7T8https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS

解决方案:1. 使用nginx部署为同一域

                  2.配置当次请求允许跨域

这里用的第二种方法:

在网关项目中创建配置文件

@Configuration
public class MyCorsConfiguration {

    @Bean
    public CorsWebFilter corsWebFilter(){
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();

        CorsConfiguration corsConfiguration = new CorsConfiguration();

        // 1.配置跨域
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.addAllowedOrigin("http://localhost:8001");
        corsConfiguration.setAllowCredentials(true);

        source.registerCorsConfiguration("/**",corsConfiguration);
        System.out.println("跨域访问=======================================");
        return new CorsWebFilter(source);
    }
}
  1. @Configuration 注解表明这个类可以被 Spring 框架用于配置服务。

  2. @Bean 注解定义了一个名为 corsWebFilter 的 bean,这个 bean 会在 Spring 应用上下文启动时被创建。

  3. UrlBasedCorsConfigurationSource 是一个 CORS 配置源,它根据 URL 模式来注册 CORS 配置。

  4. CorsConfiguration 是一个 CORS 配置对象,它定义了哪些源可以发起跨域请求,哪些 HTTP 方法被允许,以及是否允许携带认证信息等。

  5. addAllowedHeader("*") 允许任何头信息。

  6. addAllowedMethod("*") 允许任何 HTTP 方法(GET、POST、PUT、DELETE 等)。

  7. addAllowedOrigin("http://localhost:8001") 允许特定的源(在这个例子中是 http://localhost:8001)发起跨域请求。注意,这里没有使用 "*",这意味着只有指定的源被允许。

  8. setAllowCredentials(true) 指示这个 CORS 配置支持发送认证信息(如 cookies)。当这个属性为 true 时,必须在响应中包含 Access-Control-Allow-Credentials 头,并且它的值也必须是 true。

  9. source.registerCorsConfiguration("/**", corsConfiguration) 将上面的 CorsConfiguration 注册到所有的 URL 路径上(/** 是一个通配符,匹配所有的 URL)。

  10. return new CorsWebFilter(source) 创建了一个 CorsWebFilter 实例,它将会使用之前定义的 CorsConfiguration 来处理跨域请求。

注意: 

1.出现这个错误时,是因为当allowCredentials设置为true时,不能使用特殊值"*"来配置allowedOrigins,使用"*"时,无法在响应头中设置"Access-Control-Allow-Origin",这会使得跨域请求中的Cookie等认证信息无法传递。

方法:

        (1)明确列出所有允许的源(allowedOrigins),而不是使用"*"

        (2)使用allowedOriginPatterns来允许特定模式的源。

corsConfiguration.addAllowedOrigin("http://localhost:8001");
corsConfiguration.addAllowedOriginPattern("*");

2.出现CORS错误说明这个链接需要配置,继续添 addAllowedOrigin("http://localhost:8001")即可,如果不知道需要添加什么端口直接看浏览器的错误信息即可。

  • 11
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值