当我在微服务后端之间发出请求时 SessionId 丢失
SessionId lost when I make a request between backend of microservices
我正在尝试在微服务之间发出请求,以检索具有相同角色的用户列表。为此,首先我在微服务 1 的前端和后端之间发出请求。接下来,我从微服务 1 后端调用微服务 2 中的端点,但是 session Id 丢失了,我可以检索语境。
我正在使用 spring 安全和 Redis 作为 session 控件。
我手动从微服务 1 检索 session ID,并将其作为第二次调用的 header 的属性添加到微服务 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);
我不知道你问题的确切答案,但就你的设计而言,我想问你是否真的想使你的微服务 1 依赖于微服务 2。微服务应该在其工作方式上是自治的,并且能够自行部署(无论如何在理论上!)。也许您可以拥有一个接收会话信息的编排微服务,然后调用其他 2 个微服务通过 'standard' 属性传递该信息。
headers.set("Session",sessionID);
我认为问题是您使用了错误的标识符。据我所知,默认是JSESSIONID。
我在这里看到的另一个问题是 JSESSIONID 应该在 cookie 中。向您的 'microservice2'.
发送请求时,尝试将其放入 cookie 中
最后,我解决了添加拦截器作为组件的问题:
@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 的前端和后端之间发出请求。接下来,我从微服务 1 后端调用微服务 2 中的端点,但是 session Id 丢失了,我可以检索语境。 我正在使用 spring 安全和 Redis 作为 session 控件。 我手动从微服务 1 检索 session ID,并将其作为第二次调用的 header 的属性添加到微服务 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);
我不知道你问题的确切答案,但就你的设计而言,我想问你是否真的想使你的微服务 1 依赖于微服务 2。微服务应该在其工作方式上是自治的,并且能够自行部署(无论如何在理论上!)。也许您可以拥有一个接收会话信息的编排微服务,然后调用其他 2 个微服务通过 'standard' 属性传递该信息。
headers.set("Session",sessionID);
我认为问题是您使用了错误的标识符。据我所知,默认是JSESSIONID。
我在这里看到的另一个问题是 JSESSIONID 应该在 cookie 中。向您的 'microservice2'.
发送请求时,尝试将其放入 cookie 中最后,我解决了添加拦截器作为组件的问题:
@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;
}