OpenFeign實現(xiàn)攜帶請求頭方案詳細介紹
在使用OpenFeign請求其他服務接口時,默認不攜帶header信息,這樣就導致無法攜帶登錄用戶信息。要解決這個問題,下面分兩種情況進行處理。
1. 同步請求
對于同步請求,無需另作處理,只需從header中獲取token信息,放入新請求即可。
@Configuration public class FeignConfig { @Bean public RequestInterceptor requestInterceptor(){ return new RequestInterceptor() { @Override public void apply(RequestTemplate requestTemplate) { ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if(requestAttributes != null){ //獲取請求的token信息 String token = requestAttributes.getRequest().getHeader(BaseConstant.TOKEN_HEADER); //同步到請求中 requestTemplate.header(BaseConstant.TOKEN_HEADER,token); return; } } }; } }
2. 異步請求
對于異步請求(例如A線程接到了HTTP請求,然后開啟子線程B,B處理完成后調用openfeign接口),是無法使用上述方法的。因為RequestContextHolder.getRequestAttributes()方法獲取的requestAttributesHolder變量,是ThreadLocal類型的:
private static final ThreadLocal<RequestAttributes> requestAttributesHolder = new NamedThreadLocal("Request attributes");
所以想到了一個簡單的辦法,在創(chuàng)建子線程時,將當前線程的token信息傳遞到子線程中。子線程在調用feign接口前,將token存入當前線程變量中,token類定義以及ThreadLocal定義如下:
//Token類定義 @Data public class TokenInfo implements Serializable { private String token; } //TokenContext類定義 public class TokenContext { public static final ThreadLocal<TokenInfo> tokenInfo = new ThreadLocal<>(); //設置token信息 public static void set(TokenInfo info){ tokenInfo.set(info); } //獲取token信息 public static TokenInfo get(){ return tokenInfo.get(); } //移除token信息 public static void remove(){ tokenInfo.remove(); } }
調用接口處理:
TokenInfo info = new TokenInfo(); info.setToken(token); TokenContext.set(info); //調用接口 feign.interface; //一定要記得刪除,不然后內存泄露風險 TokenContext.remove();
最后,上述創(chuàng)建的Bean改為:
@Configuration public class FeignConfig { @Bean public RequestInterceptor requestInterceptor(){ return new RequestInterceptor() { @Override public void apply(RequestTemplate requestTemplate) { //老請求 獲取當前線程請求的請求信息 ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if(requestAttributes != null){ String token = requestAttributes.getRequest().getHeader(BaseConstant.TOKEN_HEADER); //同步到請求中 requestTemplate.header(BaseConstant.TOKEN_HEADER,token); return; } TokenInfo tokenInfo = TokenContext.get(); if(userInfo != null){ String token = tokenInfo.getToken(); requestTemplate.header(BaseConstant.TOKEN_HEADER,BaseConstant.TOKEN_PREFIX + token); return; } } }; } }
到此這篇關于OpenFeign實現(xiàn)攜帶請求頭方案詳細介紹的文章就介紹到這了,更多相關OpenFeign攜帶請求頭內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
基于Jenkins+Maven+Gitea+Nexus搭建CICD環(huán)境的方式
這篇文章主要介紹了基于Jenkins+Maven+Gitea+Nexus從0到1搭建CICD環(huán)境,大家都知道Nexus是一套“開箱即用”的系統(tǒng)不需要數(shù)據(jù)庫,它使用文件系統(tǒng)加Lucene來組織數(shù)據(jù),需要的朋友可以參考下2022-01-01springcloud整合gateway實現(xiàn)網(wǎng)關全局過濾器功能
本文主要介紹了springcloud整合gateway實現(xiàn)網(wǎng)關全局過濾器功能,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02