【问题标题】:SessionId lost when I make a request between backend of microservices当我在微服务后端之间发出请求时,SessionId 丢失
【发布时间】:2017-07-25 15:05:35
【问题描述】:

我正在尝试在微服务之间发出请求,以检索具有相同角色的用户列表。为此,首先我在微服务 1 内的前端和后端之间发出请求。接下来,我从微服务 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);

【问题讨论】:

  • 复制所有标头(可能有身份验证信息)以及 cookie(会话通常添加到 cookie)。顺便说一句,如果 2 个服务在不同的 JVM 上工作,它们可能根本没有公共会话
  • 两者在同一个JVM,会话由Redis控制

标签: java spring rest security microservices


【解决方案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;
}

【讨论】:

    【解决方案2】:

    我不知道你的问题的确切答案,但就你的设计而言,我会质疑你是否真的想让你的微服务 1 依赖于微服务 2。微服务在其工作方式上应该是自治的,并且能够自行部署(理论上无论如何!)。可能您可以拥有一个编排微服务,它接收您的会话信息,然后调用其他 2 个微服务以通过“标准”属性传递该信息。

    【讨论】:

    • 微服务 1 是完全自治的,它可以部署在自己的设备上,但它提供的服务需要来自微服务 2 的一些信息
    【解决方案3】:

    headers.set("Session",sessionID);

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

    我在这里看到的另一个问题是 JSESSIONID 应该在 cookie 中。在向您的“微服务2”发送请求时尝试将其放入 cookie。

    【讨论】:

      猜你喜欢
      • 2011-07-06
      • 1970-01-01
      • 2016-07-02
      • 2021-07-09
      • 2014-07-30
      • 1970-01-01
      • 2020-12-27
      • 2021-12-22
      • 1970-01-01
      相关资源
      最近更新 更多