当我在微服务的后端之间发出请求时,SessionId丢失了

时间:2017-05-22 14:20:30

标签: java spring rest security microservices

我正在尝试在微服务之间发出请求,以便检索具有相同角色的用户列表。为此,首先我在微服务1内的FrontEnd和Backend之间发出请求。接下来,我从微服务1后端调用微服务2中的端点,但会话ID丢失,我可以检索上下文。 我使用spring security和Redis进行会话控制。 手动,我从微服务1中检索会话ID,并将其作为第二次调用的标题的属性添加到微服务2.但它不起作用。

String sessionID= RequestContextHolder.currentRequestAttributes().getSessionId();
RestTemplate rest = new RestTemplate();
HttpHeaders headers= new HttpHeaders();            
headers.set("Session",sessionID);
HttpEntity<ResponseData> entity = new HttpEntity<ResponseData>(headers);
ResponseEntity<ResponseData> responseEntity =rest.exchange(targetApi,  HttpMethod.GET, entity,ResponseData.class);

enter image description here

3 个答案:

答案 0 :(得分:1)

最后,我解决了将拦截器添加为组件的问题:

@Component
public class SpringSessionClientHttpRequestInterceptor implements ClientHttpRequestInterceptor {

@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
    throws IOException {

    request.getHeaders().add("Cookie", "SESSION=" + sessionId);
    return execution.execute(request, body);
}

}

我创建了一个@Bean来配置其余模板:

@Bean
public RestTemplate restTemplate(){
    RestTemplate rest = new RestTemplate();
    ClientHttpRequestInterceptor interceptor= new SpringSessionClientHttpRequestInterceptor();
    List<ClientHttpRequestInterceptor> interceptors = new ArrayList<ClientHttpRequestInterceptor>();
    interceptors.add(interceptor);
    rest.setInterceptors(interceptors);  
    return rest;
}

答案 1 :(得分:0)

我不知道你问题的确切答案,但就你的设计而言,如果你真的想根据microsevice2制作你的微服务1,我会质疑。微服务应该以其工作方式自主,并且能够自行部署(理论上无论如何!)。也许你可以有一个编排微服务来接收你的会话信息,然后调用另外两个微服务来通过'标准'属性传递这些信息。

答案 2 :(得分:0)

  

headers.set( “会话”,会话ID);

我认为问题在于您使用了错误的标识符。据我所知,默认情况下是JSESSIONID。

我在这里可以看到的另一个问题是JSESSIONID应该在cookie中。在向“microservice2”发送请求时,请尝试将其放入cookie中。