You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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过滤器逻辑

如果业务场景必须使用自定义过滤器实现跨域,按以下规则修改:

  1. 仅对OPTIONS预检请求直接返回响应,普通业务请求必须放行到后续过滤器链
  2. 调整过滤器优先级为最高,避免业务请求被其他逻辑拦截,示例代码如下:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 12:42:00