java - Webflux WebClient 的 Cookie 管理

标签 java spring-webflux

我有一个 WebClient 将带有登录凭据的 JSON 对象发送到远程服务器。然后远程服务器返回 cookie。之后,我需要将数据与 cookie 一起发布到该远程服务器。但是,我无法弄清楚如何在 POST 中重用 cookie。

据我所知,登录响应给出了以下结构 MultiValueMap<String, ResponseCookie> ,但是在 POST 上设置 cookie 的代码需要 MultiValueMap<String, String>或只是 cookie(String, String) .

我想我一定缺少一些转换器魔法,但是什么?
我什至需要退回整个 cookies 吗?

cookies 看起来像这样;

{SSO_Sticky_Session-47873-loadBalancedAdminGrp=[SSO_Sticky_Session-47873-loadBalancedAdminGrp=BNAMAKAKJABP; Path=/; HttpOnly], AUTH_TOKEN=[AUTH_TOKEN=v0l3baVZejIKjdzA1KGpkz4ccnosE6rKLQig1D2bdb-voFmVrF_aaYgzWl3Yc8QK; Path=/], uid=[uid=sjzipQdBtU30OlVbPWtDK2625i24i6t6g3Rjl5y5XcI=; Path=/], __cfduid=[__cfduid=dd872f39fd1d3bfe2a5c7316cd9ff63cd1554623603; Path=/; Domain=.aDomain.net; Max-Age=31535999; Expires=Mon, 6 Apr 2020 07:53:23 GMT; HttpOnly], JSESSIONID=[JSESSIONID=A264A713AD060EE12DA8215AEF66A3C0; Path=/aPath/; HttpOnly]}

我的代码如下。为简洁起见,我删除了内容类型;
WebClient webClient = WebClient.create("https://remoteServer");
MultiValueMap<String, ResponseCookie> myCookies;

webClient
  .post()
  .uri("uri/login")
  .body(Mono.just(myLoginObject), MyLogin.class)
  .exchange()
  .subscribe(r -> 
    System.err.println("Received:" + r.cookies());
    myCookies = r.cookies();
   );

webClient
  .post()
  .uri("/uri/data")
  .cookies(????) // what goes here ??
  .body(....)
  .exchange();

最佳答案

在编写服务器端 Java 和 JSP 多年后,我在很大程度上忽略了 cookie 的概念,因为管理由(例如)服务器端的 Tomcat 和客户端的浏览器负责。在 Spring 中对 cookie 处理的任何搜索始终集中在 Spring 服务器 并且很少在 Spring 上实际成为另一台服务器的客户端。 WebClient 的任何示例都很简单,并且没有假设任何形式的安全协商。

阅读cookie解释Wikipedia Cookies和 cookie 标准 RFC6265 ,对我来说为什么传入的 cookie 在类中是有意义的 ResponseCookie传出的 cookie 是 String .传入的 cookie 具有其他元数据(例如)Domain , PathMax-Age .

对于我的实现,供应商没有指定需要返回哪些 cookie,所以我最终返回了所有这些 cookie。因此,我修改后的代码如下;

WebClient webClient = WebClient.create("https://remoteServer");
MultiValueMap<String, String> myCookies = new LinkedMultiValueMap<String, String>()

webClient
  .post()
  .uri("uri/login")
  .body(Mono.just(myLoginObject), MyLogin.class)
  .exchange()
  .subscribe(r -> 
      for (String key: r.cookies().keySet()) {
        myCookies.put(key, Arrays.asList(r.cookies().get(key).get(0).getValue()));
      }
   );

webClient
  .post()
  .uri("/uri/data")
  .cookies(cookies -> cookies.addAll(myCookies))
  .body(....)
  .exchange();

关于java - Webflux WebClient 的 Cookie 管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55557623/

相关文章:

java - 如何在java中使用for循环动态创建二维数组?

java - Spring 5 响应式(Reactive) websocket : Clients not receiving same data from hot stream

java - Spring WebFlux 中的同步方法?

java - Java EE 环境中的单元测试

Java 队列 - 为什么 "poll"和 "offer"?

java - WebTestClient 根据另一个 jsonPath 检查 jsonPath

Spring 集成 WebFlux 错误处理

groovy - Spring Integration webflux - 验证输入 JSON 正文

java - 哪种 Oracle JDBC 驱动程序与 Java 一起使用来开发 Web 应用程序

java运行包括来自终端的类路径