Spring Cloud Gateway添加CORS配置后Nacos负载均衡失效问题咨询
问题根因
该冲突问题本质是自定义CORS过滤器的实现逻辑或优先级影响了负载均衡过滤器的正常执行:
- Spring Cloud Gateway的负载均衡逻辑由
ReactiveLoadBalancerClientFilter实现,默认优先级为10150,若自定义CORS过滤器优先级高于该值,且错误中断了过滤器链,会导致负载均衡逻辑完全不执行。 - 若自定义过滤器对请求URI进行了修改,丢失了
lb://前缀的服务标识,也会导致负载均衡组件无法识别待转发的服务,自然不会触发Nacos的轮询策略。
解决方案
方案一:使用官方原生CORS配置(推荐,无兼容性问题)
无需自行实现CORS过滤器,直接通过yml配置即可实现跨域,原生实现默认和负载均衡逻辑完全兼容:
spring: cloud: gateway: globalcors: cors-configurations: '[/**]': allowed-origin-patterns: "*" # 生产环境请替换为实际允许的域名 allowed-methods: "*" allowed-headers: "*" allow-credentials: true max-age: 3600
配置完成后删除自定义CORS过滤器即可,跨域和Nacos负载均衡均可正常运行。
方案二:调整自定义CORS过滤器逻辑
如果业务场景必须使用自定义过滤器实现跨域,按以下规则修改:
- 仅对OPTIONS预检请求直接返回响应,普通业务请求必须放行到后续过滤器链
- 调整过滤器优先级为最高,避免业务请求被其他逻辑拦截,示例代码如下:
import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilter; import org.springframework.web.server.WebFilterChain; import reactor.core.publisher.Mono; @Component @Order(Ordered.HIGHEST_PRECEDENCE) public class CorsGlobalFilter implements WebFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) { HttpHeaders headers = exchange.getResponse().getHeaders(); // 统一添加CORS响应头 headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "*"); headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "GET,POST,PUT,DELETE,OPTIONS"); headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "*"); headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true"); headers.add(HttpHeaders.ACCESS_CONTROL_MAX_AGE, "3600"); // 仅预检请求直接返回 if (exchange.getRequest().getMethod() == HttpMethod.OPTIONS) { exchange.getResponse().setStatusCode(HttpStatus.OK); return Mono.empty(); } // 普通请求放行到后续过滤器链,保证负载均衡逻辑正常执行 return chain.filter(exchange); } }
修改完成后即可同时兼容CORS跨域配置与Nacos轮询负载均衡。
内容的提问来源于stack exchange,提问作者Zuoyang Ding
相关产品推荐
相关产品推荐

