fix(yudao-gateway):

解决entry.setValue导致空指针的问题
(exchange.getResponse().getHeaders() 来自 Spring WebFlux,使用的是 TomcatHeadersAdapter。这意味着 getHeaders() 实际上是 Tomcat 的 MimeHeaders 适配器,而 entry.setValue() 可能改变了 MimeHeaders 的内部结构,导致 Iterator 失效。)
pull/177/head
duzonghui 2025-03-31 14:17:45 +08:00
parent ace3401693
commit 0e5c5ba6e8
1 changed files with 13 additions and 4 deletions

View File

@ -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<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return chain.filter(exchange).then(Mono.defer(() -> {
exchange.getResponse().getHeaders().entrySet().stream()
List<String> 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<String>() {{
add(kv.getValue().get(0));
}}));
.map(Map.Entry::getKey)
.collect(Collectors.toList());
keysToModify.forEach(key->{
List<String> 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);
}));
}