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); })); }