如何在 Spring WebClient 请求之间保存 cookie?

How can I save cookies between Spring WebClient requests?

我想在我的项目中使用 Spring Boot WebClient 来访问 REST-API。第一个请求执行登录到 REST-API 并接收一个 cookie 作为响应。此 cookie 用作所有其他请求的“API-令牌”。

但是,WebClient 似乎没有存储cookie。我必须自己做吗?如果是这样,最好的方法是什么?

以下是我的示例源代码。第二个请求不使用第一个请求中的 cookie。

// ### 1. API-Call to get the cookie ###
ClientResponse clientResponse = webClient
        .get()
        .uri("/api/")
        .headers(headers -> headers.setBasicAuth(user,passwd)
        .exchange()
        .block();

// ### Debug Cookie ###
if (clientResponse.statusCode().is2xxSuccessful()) {
    for (String key : clientResponse.cookies().keySet()) {
        LOG.debug("key:" + key + " value: " + clientResponse.cookies().get(key).get(0).getValue() );
    }
}   

// ### 2.API-Call (with cookie) ###
webClient
    .get()
    .uri("/api/document/4711")
    .retrieve()
    .onStatus(HttpStatus::is2xxSuccessful, r -> {
        for (String key : r.cookies().keySet()) {
            LOG.debug("key:" + r.cookies().get(key).get(0).getValue());
        }
        return Mono.empty();
    })
    .onStatus(HttpStatus::is4xxClientError, r -> {
        System.out.println("2 4xx error");
        for (String key : r.cookies().keySet()) {
            LOG.debug("key:" + r.cookies().get(key).get(0).getValue());
        }
        return Mono.error(new RuntimeException("" + r.statusCode().value()));
    })
    .onStatus(HttpStatus::is5xxServerError, response -> {
        LOG.error("2 5xx error");
        return Mono.error(new RuntimeException("5xx"));
    })
    .bodyToMono(String.class)
    .block();

为了存储 cookie,我们更改为 Jetty HttpClient (org.eclipse.jetty.client.HttpClient)。

查看此答案以了解如何启用它: