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

如何在Spring Cloud Gateway请求Cookie集合中添加新HttpCookie?

解决方案:Spring Cloud Gateway中添加请求Cookie的几种方法

方法一:自定义ServerHttpRequestDecorator重写getCookies()

通过包装原请求,复制原有Cookie集合并添加新Cookie,重写getCookies()方法返回修改后的可操作集合,是最直接的解决方案。示例代码可实现为GatewayFilter:

@Component
public class AddCookieFilter implements GatewayFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 复制原请求的Cookie集合到可修改的MultiValueMap中
        MultiValueMap<String, HttpCookie> newCookies = new LinkedMultiValueMap<>(exchange.getRequest().getCookies());
        // 添加新的Cookie
        newCookies.add("sessionid", new HttpCookie("sessionid", "abcdedf"));

        // 包装请求,重写getCookies方法返回修改后的集合
        ServerHttpRequest modifiedRequest = new ServerHttpRequestDecorator(exchange.getRequest()) {
            @Override
            public MultiValueMap<String, HttpCookie> getCookies() {
                return newCookies;
            }
        };

        // 将修改后的请求传入过滤器链
        return chain.filter(exchange.mutate().request(modifiedRequest).build());
    }

    @Override
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE; // 确保该过滤器优先执行
    }
}

方法二:直接修改请求头中的Cookie字段

HTTP请求的Cookie本质是通过Cookie请求头传递的,因此可以直接构造新的Cookie头字符串,追加或替换原请求头:

@Component
public class AddCookieViaHeaderFilter implements GatewayFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest originalRequest = exchange.getRequest();
        String originalCookieHeader = originalRequest.getHeaders().getFirst(HttpHeaders.COOKIE);

        // 拼接新的Cookie头内容
        StringBuilder newCookieHeader = new StringBuilder();
        if (originalCookieHeader != null) {
            newCookieHeader.append(originalCookieHeader).append("; ");
        }
        newCookieHeader.append("sessionid=abcdedf");

        // 修改请求头并构建新请求
        ServerHttpRequest modifiedRequest = originalRequest.mutate()
                .header(HttpHeaders.COOKIE, newCookieHeader.toString())
                .build();

        return chain.filter(exchange.mutate().request(modifiedRequest).build());
    }

    @Override
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE;
    }
}

原代码失效原因说明

你之前调用mutate().build()得到的请求只是原请求的浅包装,getCookies()仍然返回AbstractServerHttpRequest中默认的不可修改MultiValueMap,直接调用add()方法自然会触发UnsupportedOperationException。必须通过重写getCookies()方法或直接操作请求头的方式,才能真正修改请求的Cookie信息。

内容的提问来源于stack exchange,提问作者Deepak Chhetri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:10:11