From 0e5c5ba6e8a16b7588cd1a3ea26a0ec744429ff1 Mon Sep 17 00:00:00 2001 From: duzonghui Date: Mon, 31 Mar 2025 14:17:45 +0800 Subject: [PATCH] fix(yudao-gateway): MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 解决entry.setValue导致空指针的问题 (exchange.getResponse().getHeaders() 来自 Spring WebFlux,使用的是 TomcatHeadersAdapter。这意味着 getHeaders() 实际上是 Tomcat 的 MimeHeaders 适配器,而 entry.setValue() 可能改变了 MimeHeaders 的内部结构,导致 Iterator 失效。) --- .../filter/cors/CorsResponseHeaderFilter.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/yudao-gateway/src/main/java/cn/iocoder/yudao/gateway/filter/cors/CorsResponseHeaderFilter.java b/yudao-gateway/src/main/java/cn/iocoder/yudao/gateway/filter/cors/CorsResponseHeaderFilter.java index 3ea0bd218..043957184 100644 --- a/yudao-gateway/src/main/java/cn/iocoder/yudao/gateway/filter/cors/CorsResponseHeaderFilter.java +++ b/yudao-gateway/src/main/java/cn/iocoder/yudao/gateway/filter/cors/CorsResponseHeaderFilter.java @@ -10,6 +10,10 @@ import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * 解决 Spring Cloud Gateway 2.x 跨域时,出现重复 Origin 的 BUG @@ -31,13 +35,18 @@ public class CorsResponseHeaderFilter implements GlobalFilter, Ordered { @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { return chain.filter(exchange).then(Mono.defer(() -> { - exchange.getResponse().getHeaders().entrySet().stream() + List keysToModify = exchange.getResponse().getHeaders().entrySet().stream() .filter(kv -> (kv.getValue() != null && kv.getValue().size() > 1)) .filter(kv -> (kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN) || kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS))) - .forEach(kv -> kv.setValue(new ArrayList() {{ - add(kv.getValue().get(0)); - }})); + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + keysToModify.forEach(key->{ + List values = exchange.getResponse().getHeaders().get(key); + if (values != null && !values.isEmpty()) { + exchange.getResponse().getHeaders().put(key, Collections.singletonList(values.get(0))); + } + }); return chain.filter(exchange); })); }