Spring 启动 RestTemplate 从回调中获取 Cookie

Spring Boot RestTemplate get Cookie from Callback

我想使用 Spring RestTemplate 从回调中检索 jwt 令牌,该回调是来自登录 URL 的重定向 URL。

我已经能够连接到登录 URL,我已经能够跟随重定向 link 到回调,但是我无法取回存储的令牌在回调的响应 header 中。

RestTemplate restTemplate = new RestTemplate();
String url = my_login_url;

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
map.add(my_login);
map.add(my_password);

HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);

final HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
final HttpClient httpClient = HttpClientBuilder.create()
                .setRedirectStrategy(new LaxRedirectStrategy())
                .build();
factory.setHttpClient(httpClient);
restTemplate.setRequestFactory(factory);

ResponseEntity<String> response = restTemplate.exchange(url,
                HttpMethod.POST,
                request,
                String.class);

// OUCH !! response does not contain the token I'm trying to retrieve !! The token is in the header of the callback !!

任何人都可以帮助我了解如何访问回调的 header 吗?

您可以使用

response.getHeaders().get(HttpHeaders.SET_COOKIE);

(当客户端通过“Cookie”header 发送它拥有的 cookie 时,服务器发送 cookie 以使用“Set-Cookie”header 设置。)

这是一个 returns 列表,因为每个 cookie 都将在一个额外的 header 中,名称相同。

经过一些研究,我找到了一种方法来检索该令牌,这对我来说更像是一种破解,而不是实际的解决方案。
这个想法是 apache HttpClient 包含一个 cookie 存储,其中只有我需要的令牌。不幸的是,HttpClient 没有任何 getter,只有 execute 方法,而我已经在 RestTemplates 上了。
但是,可以在构建 HttpClient 实例时将 Cookie Store 作为参数传递。该 Cookie Store 将在发布身份验证请求时被填充。

代码的最终版本如下所示:

RestTemplate restTemplate = new RestTemplate();
String url = my_login_url;

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
map.add(my_login);
map.add(my_password);

HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);

final HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
CookieStore basicCookieStore = new BasicCookieStore();
final HttpClient httpClient = HttpClientBuilder.create()
                .setRedirectStrategy(new LaxRedirectStrategy())
                .setDefaultCookieStore(basicCookieStore)
                .build();
factory.setHttpClient(httpClient);
restTemplate.setRequestFactory(factory);

restTemplate.exchange(url,
                HttpMethod.POST,
                request,
                String.class);

Cookie cookie  = basicCookieStore.getCookies().stream()
                .findFirst()
                .orElseThrow(() -> new RuntimeException(url));
System.out.println(cookie.getValue());

请注意,我什至对 restTemplate.exchange 查询的响应不感兴趣。