laf*_*ual 10 java spring-webflux
我有一个 WebClient 将带有登录凭据的 JSON 对象发送到远程服务器。然后远程服务器返回 cookie。之后,我需要将数据与 cookie 一起发布到该远程服务器。但是,我无法弄清楚如何在 POST 中重用 cookie。
据我所知,登录响应提供了以下结构MultiValueMap<String, ResponseCookie>,但是在 POST 上设置 cookie 的代码需要MultiValueMap<String, String>或只是cookie(String, String).
我想我一定缺少一些转换器魔法,但是什么?我什至需要退回整个饼干吗?
饼干看起来像这样;
{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]}
Run Code Online (Sandbox Code Playgroud)
我的代码如下。为简洁起见,我删除了内容类型;
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();
Run Code Online (Sandbox Code Playgroud)
在编写服务器端 Java 和 JSP 多年后,我在很大程度上忽略了 cookie 的概念,因为管理是由(例如)服务器端的 Tomcat 和客户端的浏览器负责的。任何对 Spring 中 cookie 处理的搜索总是集中在 Spring服务器上,而很少关注 Spring 实际上是另一个服务器的客户端。WebClient 的任何示例都很简单,并且没有假设任何形式的安全协商。
阅读了 Cookie 解释Wikipedia Cookies和 Cookie 标准RFC6265后,我明白了为什么传入 Cookie 是类ResponseCookie而传出 Cookie 是String. 传入的 cookie 具有关于(例如)Domain、Path和的附加元数据Max-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();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5770 次 |
| 最近记录: |