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-01
springcloud整合gateway實現(xiàn)網(wǎng)關全局過濾器功能
本文主要介紹了springcloud整合gateway實現(xiàn)網(wǎng)關全局過濾器功能,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02

