Spring cloud gateway解决网关跨域问题

时间:2024-03-21 22:15:39

一、Spring cloud gateway介绍

Spring Cloud Gateway是一个基于Spring Framework 5,Spring Boot 2和Project Reactor等技术构建的API网关服务。它旨在为微服务架构中的应用程序提供统一的路由服务,同时还具有过滤、流量控制、安全性、监控等功能。

主要功能和特性:

  1. 动态路由:Spring Cloud Gateway可以根据特定的路由规则将请求动态路由到不同的目标服务,使得网关可以灵活适应不同的后端服务。

  2. 过滤器:可以通过预定义的过滤器或自定义过滤器来对请求进行修改、验证、日志记录等处理,以确保请求的安全性和可靠性。

  3. 负载均衡:支持基于负载均衡的路由策略,可以将请求平衡地分发到多个实例中,提高系统的性能和可用性。

  4. 限流:可以配置限流策略,对请求进行限制,防止突发流量对系统造成影响,保护后端服务的稳定性。

  5. 熔断:通过集成Hystrix等熔断器,可以实现对后端服务的熔断和降级,防止由于后端服务不可用而导致的系统崩溃。

  6. 重试:支持在请求失败时进行重试,提高系统的健壮性和可靠性。

  7. 安全性:可以集成Spring Security等安全框架,对请求进行认证和授权,保护系统的安全性。

  8. 监控:提供了丰富的监控和统计功能,可以实时查看网关的运行状态、请求流量等信息,帮助进行系统调优和故障排查。

二、跨域概念说明

       跨域(Cross-Origin)指的是在 Web 应用程序中,当一个资源(如脚本、样式表、图像等)来自于不同的域、协议或端口时,发生了跨域访问。例如,如果一个网页的源代码来自 http://domain1.com,而它加载的一个 JavaScript 文件来源于 http://domain2.com,那么这就属于跨域访问。

三、Gateway解决跨域问题的方法

1、创建全局过滤器解决

import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
 
@Configuration
public class CorsFilter {
 
    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public GlobalFilter corsFilter() {
        return (exchange, chain) -> {
            ServerWebExchange.Builder webExchangeBuilder = exchange.mutate();
            webExchangeBuilder
                    .request(exchange.getRequest())
                    .response(exchange.getResponse());
 
            webExchangeBuilder
                    .response(exchange.getResponse()
                            .mutate()
                            .header("Access-Control-Allow-Origin", "*")
                            .header("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE, OPTIONS")
                            .header("Access-Control-Allow-Headers", "Content-Type")
                            .build());
 
            return chain.filter(webExchangeBuilder.build());
        };
    }
}

2、通过配置解决Gateway跨域问题

spring:
  cloud:
    gateway:
      globalcors: # 全局跨域配置
        cors-configurations: # 跨域配置列表
          '[/**]': # 匹配所有路径
            allowed-headers: "*" # 允许的请求头,*表示允许所有
            allowed-methods: # 允许的请求方法列表
              - GET
              - POST
              - PUT
              - DELETE
              - OPTIONS
            allowed-origins: "*" # 允许的请求来源,*表示允许所有
            exposed-headers: # 暴露的响应头列表
              - Authorization
              - Content-Type
            allow-credentials: true # 是否允许凭证传递,true表示允许