springboot使用feign調(diào)用session傳遞失效解決方案

標(biāo)題 框架 version
1 springboot 1.5.9.release
2 springCloud 1.2.4.release
3 eureka 1.6.2
4 feign 9.5.0

前言

使用場景:由于我們項(xiàng)目使用的是微服務(wù)框架,各個服務(wù)之間的調(diào)用,使用的是feign調(diào)用,我們項(xiàng)目調(diào)用各個模塊直接調(diào)用,如果涉及到跨服務(wù)調(diào)用的話,開始發(fā)現(xiàn)從request里面的什么東西都獲取不到,登錄的request的session肯定是空的,但是數(shù)據(jù)調(diào)用能帶過來沒有什么問題。我們增加了各個服務(wù)的攔截器之后,需要從request獲取當(dāng)前請求的用戶session。這個肯定就不行了。我們就開始尋找解決方案,最后通過踩坑終于解決session失效的問題了(解決方案如下)。

1.解決辦法:

使用feign調(diào)用的時候通過使用requestInterceptor攔截器對請求進(jìn)行攔截,代碼如下:

package com.xxx.system.feign;


import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;

import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class FeignBasicAuthRequestInterceptor implements RequestInterceptor {
      @Override
      public void apply(RequestTemplate requestTemplate) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
                .getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        Enumeration<String> headerNames = request.getHeaderNames();
        if (headerNames != null) {
          while (headerNames.hasMoreElements()) {
            String name = headerNames.nextElement();
            String values = request.getHeader(name);
            requestTemplate.header(name, values);
          }
        }
        //下面注釋掉的代碼,如果你放開,默認(rèn)是post請求(如果你的接口是get請求放開了此代碼,回報錯:405不支持post請求。)
        /*Enumeration<String> bodyNames = request.getParameterNames();
          StringBuffer body =new StringBuffer();
          if (bodyNames != null) {
              while (bodyNames.hasMoreElements()) {
                String name = bodyNames.nextElement();
                String values = request.getParameter(name);
                body.append(name).append("=").append(values).append("&");
              }
          }
         if(body.length()!=0) {
            body.deleteCharAt(body.length()-1);
            requestTemplate.body(body.toString());
            log.info("feign interceptor body:{}",body.toString());
        }*/
      }
}

注意:下面注釋掉的代碼,如果你放開,默認(rèn)是post請求(如果你的接口是get請求放開了此代碼,回報錯:405不支持post請求。(踩的坑);這個攔截器配置加到什么位置呢?設(shè)計到模塊調(diào)用的服務(wù)都需要加一個這個配置。

yml配置:

hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: false
        isolation:
          strategy: SEMAPHORE 

備注:

如果使用過程中遇到問題請留言,如果有什么不對的請高手們指正謝謝。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • ?通過前面兩章對Spring Cloud Ribbon和Spring Cloud Hystrix的介紹,我們已經(jīng)掌...
    Chandler_玨瑜閱讀 213,703評論 15 140
  • IOC 控制反轉(zhuǎn)容器控制程序?qū)ο笾g的關(guān)系,而不是傳統(tǒng)實(shí)現(xiàn)中,有程序代碼之間控制,又名依賴注入。All 類的創(chuàng)建,...
    irckwk1閱讀 970評論 0 0
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,360評論 11 349
  • 利用HTTP協(xié)議向服務(wù)器傳參的幾種途徑、響應(yīng)、Cookie、Session、類視圖、中間件 注意: 1>Dja...
    Cestine閱讀 1,292評論 0 2
  • 2018已然悄悄溜走,2019新的一年既已匆匆到來。 回首過去,腦袋里是空白的,應(yīng)是沒有做后悔的事吧,唯一遺憾就是...
    LUCKFAIRY_9c19閱讀 287評論 0 0