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處理完成后調(diào)用openfeign接口),是無法使用上述方法的。因為RequestContextHolder.getRequestAttributes()方法獲取的requestAttributesHolder變量,是ThreadLocal類型的:
private static final ThreadLocal<RequestAttributes> requestAttributesHolder = new NamedThreadLocal("Request attributes");所以想到了一個簡單的辦法,在創(chuàng)建子線程時,將當前線程的token信息傳遞到子線程中。子線程在調(diào)用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();
}
}調(diào)用接口處理:
TokenInfo info = new TokenInfo();
info.setToken(token);
TokenContext.set(info);
//調(diào)用接口
feign.interface;
//一定要記得刪除,不然后內(nèi)存泄露風險
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攜帶請求頭內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
RocketMQ線程池創(chuàng)建實現(xiàn)原理詳解
這篇文章主要為大家介紹了RocketMQ線程池創(chuàng)建實現(xiàn)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12
RabbitMQ交換機與Springboot整合的簡單實現(xiàn)
這篇文章主要介紹了RabbitMQ交換機與Springboot整合的簡單實現(xiàn),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-07-07
Lombok注解之@SuperBuilder--解決無法builder父類屬性問題
這篇文章主要介紹了Lombok注解之@SuperBuilder--解決無法builder父類屬性問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09
JVM優(yōu)先級線程池做任務隊列的實現(xiàn)方法
這篇文章主要介紹了JVM優(yōu)先級線程池做任務隊列的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-08-08
一篇文章帶你解決 IDEA 每次新建項目 maven home directory 總是改變的問題
這篇文章主要介紹了一篇文章帶你解決 IDEA 每次新建項目 maven home directory 總是改變的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09

