Srping Cloud Gateway 跨域配置 CorsWebFilter

引言:跨域问题的本质与网关的解决方案

在现代Web应用中,跨域资源共享(CORS)是前端开发中不可避免的挑战。作为微服务架构的入口,Spring Cloud Gateway提供了强大的CORS支持。本文将深入剖析网关中的跨域处理机制,揭示其与全局过滤器和安全链的交互原理。

一、配置CORS的两种方式

SpringCloudGateway 使用CorsWebFilter 来处理跨域逻辑,这个 Filter 可以通过配置开启,也可以自己定义

配置文件开启

开启跨域配置globalcors后,SpringCloudGateway 会自动注册一个全局的跨域过滤器 CorsWebFilter,会由它来处理请求的 CORS 相关逻辑

spring:
  cloud:
    gateway:
      globalcors:
        add-to-simple-url-handler-mapping: true
        cors-configurations:
          # 注意缩进
          '[/**]':
            # 注意 allowed-origins 设置* 不能与allow-credentials=true同时开启
            allowed-origins: 
              - "https://production-domain.com"
              - "http://localhost:*"
            allowed-methods: 
              - GET
              - POST
              - PUT
              - DELETE
              - OPTIONS
            allowed-headers: 
              - "Content-Type"
              - "Authorization"
            allow-credentials: true
            max-age: 3600

自定义CorsWebFilter方式

@Bean
public CorsWebFilter corsWebFilter() {
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    config.addAllowedOrigin("https://production-domain.com");
    config.addAllowedMethod("*");
    config.addAllowedHeader("*");
    config.setMaxAge(3600L);

    UrlBasedCorsConfigurationSource source = 
    new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", config);

    return new CorsWebFilter(source);
}

二、 CorsWebFilter 跨域过滤器

CorsWebFilter的核心责任

  1. Origin验证器
    • 只验证Origin头的合法性
    • 不区分请求方法(GET/POST/OPTIONS同等对待)
    • 非法Origin:直接拦截返回403
    • 合法Origin:标记请求并放行
    • 没有 Origin:直接放行
  2. 响应头装饰器
    • 在响应返回阶段检查"跨域标记"
    • 为标记的请求添加CORS头
    • 不修改业务系统的原始响应

CorsWebFilter 的跨域处理流程

  1. 请求带有orgin则进入跨域请求判断,如果origin是不允许的,那么CorsWebFilter直接拦截了请求,返回403
  2. 请求的origin是允许的,那么CorsWebFilter就会放行,后续进入SecurityWebFilterChain 、低优先级的全局过滤器,然后进入最后的路由过滤器。并且CorsWebFilter会为响应带上跨域相关的请求头
  3. 请求不带有origin请求头,CorsWebFilter 会直接放行,最后也不会为响应带上跨域相关的请求头。
  4. OPTIONS请求的路径,和非OPTIONS的路径是一样的,如果options带origin字段,则会由CorsWebFilter根据origin拦截或放行到最后的业务系统,,如果options不带有origin字段则CorsWebFilter 直接放行到业务系统,由业务系统处理该OPTIONS请求。所以业务系统也可以单独定义自己的跨域逻辑。

网关统一处理 OPTIONS 请求

可以看到,OPTIONS 请求,即使在满足网关跨域的条件下,依然会向业务系统传递,如果不需要其他要求,可以直接在网关这一层就对 OPTIONS 请求进行响应了。

@Bean
@Order(Ordered.HIGHEST_PRECEDENCE + 1)
public GlobalFilter optionsFilter() {
    return (exchange, chain) -> {
        if (exchange.getRequest().getMethod() == HttpMethod.OPTIONS) {
            // 构造标准响应
            ServerHttpResponse response = exchange.getResponse();
            response.setStatusCode(HttpStatus.NO_CONTENT);
            response.getHeaders().setAccessControlMaxAge(Duration.ofHours(1));
            return response.setComplete(); // 中断后续处理
        }
        return chain.filter(exchange);
    };
}

三、 Spring Cloud Gateway请求处理全链条

完整过滤器链执行顺序

顺序组件Order值职责
1CorsWebFilter-2147483648处理跨域逻辑
2全局过滤器 (高优先级)< -100认证、日志等预处理
3SecurityWebFilterChain-100安全认证与授权
4全局过滤器 (低优先级)> -100响应处理等后置操作
5路由过滤器1~10000路径重写、负载均衡
6下游服务-业务处理

关键组件交互时序图

### 配置Spring Cloud Gateway中的CORS白名单 为了使Spring Cloud Gateway支持源资源共享(CORS),可以利用`CorsConfiguration`类来定义允许的来源、HTTP方法和其他必要的参数[^1]。通过创建一个全局过滤器或者针对特定路由设置CORS策略,能够有效地管理哪些外部名被授权访问API网关下的资源。 对于希望应用到整个系统的宽泛配置而言,在主应用程序类上添加如下@Bean定义即可实现: ```java import org.springframework.context.annotation.Bean; import org.springframework.web.cors.CorsConfiguration; import org.springframework.cloud.gateway.route.RouteLocator; import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; // ... other imports ... @Configuration public class CorsConfig { @Bean public RouteLocator customRoutes(RouteLocatorBuilder builder) { String corsUrlPattern = "http://example.com"; // 替换成实际要加入白名单的URL模式 return builder.routes() .route(r -> r.path("/api/**") // 指定路径匹配规则 .filters(f -> f.addResponseHeader("Access-Control-Allow-Origin", corsUrlPattern)) .uri("lb://backend-service")) // 后端服务地址 .build(); } } ``` 上述代码片段展示了如何为指定路径下的请求添加响应头以允许来自给定模式(`corsUrlPattern`)的请求。需要注意的是,这种方式适用于简单的场景;如果需求更为复杂,则建议采用更灵活的方法——即基于`WebFilter`接口自定义逻辑处理每一个进入网关的HTTP请求,并动态决定是否放行该次调用[^2]。 此外,还可以直接修改application.yml文件内的属性来进行更加简便的操作: ```yaml spring: cloud: gateway: globalcors: add-to-simple-url-handler-mapping: true cors-configurations: '[/**]': allowedOrigins: "http://example.com" allowedMethods: - GET - POST - PUT - DELETE allowCredentials: true ``` 此YAML配置实现了相同的功能:它指定了允许越的所有原始站点以及它们可执行的动作列表。同时启用了凭证共享功能(`allowCredentials: true`),这通常用于涉及用户认证信息交换的情况中[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值