在微服务开发中,如何让多个微服务之间的session共享,如:登录的账号或其他信息需要保存到session中,但是不使用全局session肯定其他的微服务不能调用
我们的目的:让微服务A保存的sesion在微服务B中也能获取
因为我这里集成了OpenFein,在服务A使用OpenFein调用服务B时发现无法获取session,但是单独去执行服务B方法时又可以获取了,这是因为在连接调用时出现的问题?
第一步:这里以微服务A ,微服务B为案例
两个微服务的pom.xml类必须加入依赖
<!--加载 springboot redis包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- redis session全局共享 -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
第二步:两个微服务的yml文件均连接redis
#springboot集成redis
redis:
host: localhost
port: 6379
第三步:两个微服务的主启动类均加上
@EnableRedisHttpSession//session共享
到这一步:单独访问两个服务获取session没问题,但是一个调用一个再获取就不行了
如何处理?
我们只需要写一个类继承RequestInterceptor 实现其中的方法,传递session信息即可
mport javax.servlet.http.HttpServletRequest;
import org.springframework.session.web.http.SessionRepositoryFilter;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import feign.RequestInterceptor;
/**
* feign调用时传递session信息
* @date 2018/12/7 16:39
*/
@Component
public class FeignRequestIntercepter implements RequestInterceptor {
@Override
public void apply(feign.RequestTemplate requestTemplate) {
//通过RequestContextHolder获取本地请求
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
if (requestAttributes == null) {
return;
}
//获取本地线程绑定的请求对象
HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
//给请求模板附加本地线程头部信息,主要是cookie信息
Enumeration headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement().toString();
requestTemplate.header(name, request.getHeader(name));
}
if(!request.isRequestedSessionIdValid()){
request.setAttribute(SessionRepositoryFilter.INVALID_SESSION_ID_ATTR,null);
requestTemplate.header("cookie","SESSION="+request.getSession().getId());
}
}
}