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: truecors-configurations:# 注意缩进'[/**]':# 注意 allowed-origins 设置* 不能与allow-credentials=true同时开启allowed-origins: - "https://production-domain.com"- "http://localhost:*"allowed-methods: - GET- POST- PUT- DELETE- OPTIONSallowed-headers: - "Content-Type"- "Authorization"allow-credentials: truemax-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的核心责任
- Origin验证器:
- 只验证Origin头的合法性
- 不区分请求方法(GET/POST/OPTIONS同等对待)
- 非法Origin:直接拦截返回403
- 合法Origin:标记请求并放行
- 没有 Origin:直接放行
- 响应头装饰器:
- 在响应返回阶段检查"跨域标记"
- 为标记的请求添加CORS头
- 不修改业务系统的原始响应
CorsWebFilter 的跨域处理流程
- 请求带有orgin则进入跨域请求判断,如果origin是不允许的,那么CorsWebFilter直接拦截了请求,返回403
- 请求的origin是允许的,那么CorsWebFilter就会放行,后续进入SecurityWebFilterChain 、低优先级的全局过滤器,然后进入最后的路由过滤器。并且CorsWebFilter会为响应带上跨域相关的请求头
- 请求不带有origin请求头,CorsWebFilter 会直接放行,最后也不会为响应带上跨域相关的请求头。
- 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值 | 职责 |
---|---|---|---|
1 | CorsWebFilter | -2147483648 | 处理跨域逻辑 |
2 | 全局过滤器 (高优先级) | < -100 | 认证、日志等预处理 |
3 | SecurityWebFilterChain | -100 | 安全认证与授权 |
4 | 全局过滤器 (低优先级) | > -100 | 响应处理等后置操作 |
5 | 路由过滤器 | 1~10000 | 路径重写、负载均衡 |
6 | 下游服务 | - | 业务处理 |