Spring 休息模板 session

Spring RestTemplate session

我正在尝试使用 spring 休息模板来执行 post 登录请求。

当我在第一个请求中收到响应时,我会存储通过 cookie 接收的 session id。我在 set-cookie 响应 header 中检索它,我通过以下方式获得它:

    //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 请求 header 设置为第一个请求中收到的值:

//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);

第二个请求一切顺利,但我无法为其他请求保留 session

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

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

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