springboot使用feign呼叫session傳遞失效解決方案
標題 | 框架 | version |
---|---|---|
1 | springboot | 1.5.9.release |
2 | springCloud | 1.2.4.release |
3 | eureka | 1.6.2 |
4 | feign | 9.5.0 |
前言
使用場景:由於我們專案使用的是微服務框架,各個服務之間的呼叫,使用的是feign呼叫,我們專案呼叫各個模組直接呼叫,如果涉及到跨服務呼叫的話,開始發現從request裡面的什麼東西都獲取不到,登入的request的session肯定是空的,但是資料呼叫能帶過來沒有什麼問題。我們增加了各個服務的攔截器之後,需要從request獲取當前請求的使用者session。這個肯定就不行了。我們就開始尋找解決方案,最後通過踩坑終於解決session失效的問題了(解決方案如下)。
1.解決辦法:
使用feign呼叫的時候通過使用requestInterceptor攔截器對請求進行攔截,程式碼如下:
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); } } //下面註釋掉的程式碼,如果你放開,預設是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()); }*/ } }
注意:下面註釋掉的程式碼,如果你放開,預設是post請求(如果你的介面是get請求放開了此程式碼,回報錯:405不支援post請求。(踩的坑);這個攔截器配置加到什麼位置呢?設計到模組呼叫的服務都需要加一個這個配置。
yml配置:
hystrix: command: default: execution: timeout: enabled: false isolation: strategy: SEMAPHORE