Управление файлами cookie для Webflux WebClient - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть WebClient, который отправляет объект JSON с учетными данными для входа на удаленный сервер. Затем удаленный сервер возвращает cookie. После чего мне нужно отправить данные на этот удаленный сервер вместе с cookie. Однако я не могу понять, как повторно использовать куки в POST.

Насколько я могу судить, ответ при входе в систему дает следующую структуру MultiValueMap<String, ResponseCookie>, однако код для установки cookie на POST требует MultiValueMap<String, String> или просто cookie(String, String).

Полагаю, мне не хватает какой-то конвертерной магии, но что? Мне даже нужно вернуть весь файл cookie?

печенье выглядит так;

{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();

1 Ответ

0 голосов
/ 14 апреля 2019

Написав серверную Java и JSP в течение нескольких лет, я в значительной степени проигнорировал концепцию файлов cookie, поскольку управление осуществляется, например, Tomcat на стороне сервера и браузером на стороне клиента. Любой поиск по обработке cookie в Spring всегда фокусировался на сервере Spring и редко на Spring, фактически являющемся клиентом другого сервера. Любые примеры для WebClient были упрощенными и не предполагали какой-либо формы согласования безопасности.

Прочитав объяснение файла cookie Файлы cookie Wikipedia и стандарт файла cookie RFC6265 , мне стало понятно, почему входящий файл cookie находится в классе ResponseCookie, а исходящий файл cookie был String. Входящий файл cookie содержит дополнительные метаданные (например) Domain, Path и Max-Age.

В моей реализации поставщик не указал, какие файлы cookie необходимо вернуть, поэтому я вернул все из них. Поэтому мой исправленный код выглядит следующим образом:

WebClient webClient = WebClient.create("https://remoteServer");
MultiValueMap<String, ResponseCookie> 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();

...