java - 当我在微服务后端之间发出请求时 SessionId 丢失

标签 java spring rest security microservices

我正在尝试在微服务之间发出请求,以检索具有相同角色的用户列表。为此,我首先在微服务 1 内的前端和后端之间发出请求。接下来,我从微服务 1 后端调用微服务 2 中的端点,但其中丢失了 session ID,我可以检索上下文。 我正在使用 spring security 和 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);

enter image description here

最佳答案

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

@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;
}

关于java - 当我在微服务后端之间发出请求时 SessionId 丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44115310/

相关文章:

java - JavaFX 中的 Node.setDisable() 与 setDisabled()

java - Jsp窗体Jsp调用onClick方法

java - Spring 自定义过滤器在发送回客户端之前过滤响应

ajax - Spring 和 Spring MVC 3.0 AJAX 集成

python - 在 Django 中实现 REST Web 服务的框架

java - 在 Java 中扩展枚举

java - 设置 javascript 文件的版本。 Java EE + Tomcat

java - Spring 事务 REQUIRED 与 REQUIRES_NEW : Rollback Transaction

java - GrizzlyHttpServerFactory.createHttpServer @GET 带参数

node.js - ExpressJS REST API - 仅供内部使用的端点的最佳实践