我尝试使用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);
对于第二个请求一切顺利,但我无法保留其他请求的会话
答案 0 :(得分:0)
您需要使用某种缓存来存储访问令牌。 当您将访问下游服务时,您从缓存中获取令牌。如果缓存不包含令牌,您将进行身份验证并检索它并首先存储到缓存中。
缓存总是很棘手,因为它必须是线程安全的。我会尽量避免servlet会话。您正在消耗服务,而不是消费。
有各种缓存选项,但由于您已经在使用Spring,因此Spring缓存可能非常合适。 Take a look at this Spring Cache guide to start.