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());
        }
		
	}
}

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