OpenFeign實(shí)現(xiàn)攜帶請求頭方案詳細(xì)介紹
在使用OpenFeign請求其他服務(wù)接口時(shí),默認(rèn)不攜帶header信息,這樣就導(dǎo)致無法攜帶登錄用戶信息。要解決這個(gè)問題,下面分兩種情況進(jìn)行處理。
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接口),是無法使用上述方法的。因?yàn)镽equestContextHolder.getRequestAttributes()方法獲取的requestAttributesHolder變量,是ThreadLocal類型的:
private static final ThreadLocal<RequestAttributes> requestAttributesHolder = new NamedThreadLocal("Request attributes");所以想到了一個(gè)簡單的辦法,在創(chuàng)建子線程時(shí),將當(dāng)前線程的token信息傳遞到子線程中。子線程在調(diào)用feign接口前,將token存入當(dāng)前線程變量中,token類定義以及ThreadLocal定義如下:
//Token類定義
@Data
public class TokenInfo implements Serializable {
private String token;
}
//TokenContext類定義
public class TokenContext {
public static final ThreadLocal<TokenInfo> tokenInfo = new ThreadLocal<>();
//設(shè)置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)存泄露風(fēng)險(xiǎn)
TokenContext.remove();最后,上述創(chuàng)建的Bean改為:
@Configuration
public class FeignConfig {
@Bean
public RequestInterceptor requestInterceptor(){
return new RequestInterceptor() {
@Override
public void apply(RequestTemplate requestTemplate) {
//老請求 獲取當(dāng)前線程請求的請求信息
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;
}
}
};
}
}
到此這篇關(guān)于OpenFeign實(shí)現(xiàn)攜帶請求頭方案詳細(xì)介紹的文章就介紹到這了,更多相關(guān)OpenFeign攜帶請求頭內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
RocketMQ線程池創(chuàng)建實(shí)現(xiàn)原理詳解
這篇文章主要為大家介紹了RocketMQ線程池創(chuàng)建實(shí)現(xiàn)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
RabbitMQ交換機(jī)與Springboot整合的簡單實(shí)現(xiàn)
這篇文章主要介紹了RabbitMQ交換機(jī)與Springboot整合的簡單實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07
Lombok注解之@SuperBuilder--解決無法builder父類屬性問題
這篇文章主要介紹了Lombok注解之@SuperBuilder--解決無法builder父類屬性問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
JVM優(yōu)先級(jí)線程池做任務(wù)隊(duì)列的實(shí)現(xiàn)方法
這篇文章主要介紹了JVM優(yōu)先級(jí)線程池做任務(wù)隊(duì)列的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
一篇文章帶你解決 IDEA 每次新建項(xiàng)目 maven home directory 總是改變的問題
這篇文章主要介紹了一篇文章帶你解決 IDEA 每次新建項(xiàng)目 maven home directory 總是改變的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09

