最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

OpenFeign實現(xiàn)攜帶請求頭方案詳細介紹

 更新時間:2022年11月18日 16:34:07   作者:hi_kong  
這篇文章主要介紹了OpenFeign實現(xiàn)攜帶請求頭方案,在通過???OpenFeign???進行服務調(diào)用的過程中,我們需要將用戶的??user-token???、??lang??等信息放入請求header中。在分布式系統(tǒng)中,往往一個業(yè)務接口內(nèi)部會發(fā)生多次RPC調(diào)用

在使用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)原理詳解

    這篇文章主要為大家介紹了RocketMQ線程池創(chuàng)建實現(xiàn)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • springboot的@Value中#和$區(qū)別詳解

    springboot的@Value中#和$區(qū)別詳解

    這篇文章主要介紹了springboot的@Value中#和$區(qū)別詳解,@Value注解的作用主要可以給屬性直接賦值、也可以讀取配置文件中的值給屬性賦值,需要的朋友可以參考下
    2023-11-11
  • RabbitMQ交換機與Springboot整合的簡單實現(xiàn)

    RabbitMQ交換機與Springboot整合的簡單實現(xiàn)

    這篇文章主要介紹了RabbitMQ交換機與Springboot整合的簡單實現(xiàn),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-07-07
  • MyBatis的MapKey注解實例解析

    MyBatis的MapKey注解實例解析

    這篇文章主要為大家介紹了MyBatis的MapKey注解實例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • Logback配置文件這么寫(TPS提高10倍)

    Logback配置文件這么寫(TPS提高10倍)

    這篇文章主要介紹了Logback配置文件這么寫(TPS提高10倍),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • Lombok注解之@SuperBuilder--解決無法builder父類屬性問題

    Lombok注解之@SuperBuilder--解決無法builder父類屬性問題

    這篇文章主要介紹了Lombok注解之@SuperBuilder--解決無法builder父類屬性問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • JVM優(yōu)先級線程池做任務隊列的實現(xiàn)方法

    JVM優(yōu)先級線程池做任務隊列的實現(xiàn)方法

    這篇文章主要介紹了JVM優(yōu)先級線程池做任務隊列的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • 詳解Java分布式Session共享解決方案

    詳解Java分布式Session共享解決方案

    這篇文章主要介紹了詳解Java分布式Session共享解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • 一篇文章帶你解決 IDEA 每次新建項目 maven home directory 總是改變的問題

    一篇文章帶你解決 IDEA 每次新建項目 maven home directory 總是改變的問題

    這篇文章主要介紹了一篇文章帶你解決 IDEA 每次新建項目 maven home directory 總是改變的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • J2EE中的struts2表單細節(jié)處理

    J2EE中的struts2表單細節(jié)處理

    這篇文章主要介紹了J2EE中的struts2表單細節(jié)處理的相關資料,需要的朋友可以參考下
    2017-06-06

最新評論

嘉兴市| 保德县| 宁陵县| 和静县| 虎林市| 浪卡子县| 长沙市| 汤阴县| 文安县| 洛宁县| 贵定县| 利辛县| 全州县| 广河县| 屏南县| 新丰县| 平安县| 涞水县| 陵水| 临颍县| 浦县| 道孚县| 咸宁市| 玛沁县| 宜章县| 汉川市| 芮城县| 鲁甸县| 广汉市| 康保县| 墨脱县| 莱芜市| 正定县| 嘉鱼县| 青河县| 巧家县| 晋中市| 广东省| 邯郸市| 金寨县| 上蔡县|