首页 > 解决方案 > 在 Spring Webflux 中添加的多个 cookie 未合并到单个 HTTP 标头中

问题描述

我正在尝试使用包含多个 cookie 的 Spring Webflux 的 WebClient 发送请求。我的代码如下所示:

Mono<Void> loginCall = webClient.post()
                           .uri("/Sites/Login")
                           .cookie("key1", "value1")
                           .cookie("key2", "value2")
                           .cookie("key3", "value3")
                           .exchange()
                           .flatMap(clientResponse -> clientResponse.bodyToMono(Void.class));

我在端点上收到的内容如下所示(注意多个 cookie 标头):

$ nc -l -p 8989
POST /Sites/Login HTTP/1.1
user-agent: ReactorNetty/0.8.11.RELEASE
host: localhost:8989
accept: */*
transfer-encoding: chunked
cookie: key1=value1
cookie: key2=value2
cookie: key3=value3

我的期望是收到这样的 HTTP 请求(单个 cookie 标头):

cookie: key1=value1; key2=value2; key3=value3

我正在使用 Spring Boot 2.1.8。

我尝试了很多方法,但我尝试的所有方法都会导致多个 cookie 标头。HTTP 规范非常清楚不能使用多个 cookie 标头这一事实(而且接收此请求的我的 Web 服务器也不喜欢它)。

如何向 WebClient 请求添加多个 cookie,以便将它们合并到单个 HTTP 标头中?(是的,我可以开始手动设置标题并合并 cookie,但这不知怎么感觉不对)

标签: javaspringcookiesspring-webflux

解决方案


有同样的问题,我发现的唯一方法是像这样手动生成“Cookie”标题(Groovy 语言):

UserInfo retrieveUserInfo(List<Cookie> cookies) {
    String cookieHeader = cookies.collect { "${it.name}=${it.value}" }.join('; ')
    return webClient
            .get()
            .uri('your API path here')
            .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
            .header(HttpHeaders.COOKIE, cookieHeader)
            .retrieve()
            .bodyToMono(UserInfo.class)
            .block()
}

推荐阅读