如何在Spring Cloud Gateway请求Cookie集合中添加新HttpCookie?
方法一:自定义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
相关产品推荐
相关产品推荐

