Spring RestTemplate会话

时间:2015-08-31 11:44:55

标签: spring rest session cookies resttemplate

我尝试使用Spring rest模板来发布登录请求。

当我在第一次请求中收到回复时,我会存储通过cookie收到的会话ID。我在一个set-cookie响应头中检索它,我通过:

    //first request
RestTemplate restTemplate = new RestTemplate();

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

LinkedMultiValueMap<String, Object> mvm = new LinkedMultiValueMap<String, Object>();
mvm.add("LoginForm_Login", "login");
mvm.add("LoginForm_Password", "password");

ResponseEntity<String> result = restTemplate.exchange(uriDWLogin, HttpMethod.POST, requestEntity, String.class);

result.getHeaders().get("Set-Cookie").stream().forEach(System.out::println);

然后在每个后续请求中,我使用第一个请求中收到的值设置Cookie请求标头:

//subsequent request
RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders();
headers.set("Cookie",cookies.stream().collect(Collectors.joining(";")));
HttpEntity<String> entity = new HttpEntity<String>(headers);
RestTemplate.exchange("http://url", HttpMethod.POST, entity, String.class);

对于第二个请求一切顺利,但我无法保留其他请求的会话

1 个答案:

答案 0 :(得分:0)

您需要使用某种缓存来存储访问令牌。 当您将访问下游服务时,您从缓存中获取令牌。如果缓存不包含令牌,您将进行身份验证并检索它并首先存储到缓存中。

缓存总是很棘手,因为它必须是线程安全的。我会尽量避免servlet会话。您正在消耗服务,而不是消费。

有各种缓存选项,但由于您已经在使用Spring,因此Spring缓存可能非常合适。 Take a look at this Spring Cache guide to start.