cloud微服务之间的调用session共享失效

在微服务开发中,如何让多个微服务之间的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());
        }
		
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章