欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

在使用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搭建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
  • 淺析Spring Security登錄驗證流程源碼

    淺析Spring Security登錄驗證流程源碼

    這篇文章主要介紹了Spring Security登錄驗證流程源碼解析,本文結合源碼講解登錄驗證流程,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11
  • SpringCloud Feign原理剖析

    SpringCloud Feign原理剖析

    feign是用在微服務中,各個微服務間的調用,它是通過聲明式的方式來定義接口,而不用實現(xiàn)接口,feign讓服務間的調用變得簡單,不用各個服務去處理http client相關的邏輯,本文詳細介紹SpringCloud Feign原理,需要的朋友可以參考下
    2023-06-06
  • Java中的內部類你了解嗎

    Java中的內部類你了解嗎

    這篇文章主要為大家介紹了Java的內部類,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • springcloud整合gateway實現(xiàn)網(wǎng)關全局過濾器功能

    springcloud整合gateway實現(xiàn)網(wǎng)關全局過濾器功能

    本文主要介紹了springcloud整合gateway實現(xiàn)網(wǎng)關全局過濾器功能,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 基于selenium 獲取新頁面元素失敗的解決方法

    基于selenium 獲取新頁面元素失敗的解決方法

    今天小編就為大家分享一篇基于selenium 獲取新頁面元素失敗的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • 深入了解Java語言中的并發(fā)性選項有何不同

    深入了解Java語言中的并發(fā)性選項有何不同

    這篇文章主要介紹了深入了解Java語言中的并發(fā)性選項有何不同,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,,需要的朋友可以參考下
    2019-06-06
  • 用Java實現(xiàn)OCR功能揭秘

    用Java實現(xiàn)OCR功能揭秘

    想知道如何用Java實現(xiàn)OCR功能嗎?本指南將揭秘這一神秘技術,讓你輕松掌握OCR的實現(xiàn)方法,無論是想提升技能還是解決問題,這篇指南都能幫助你一臂之力,需要的朋友可以參考下
    2023-12-12
  • mybatis快速入門學習教程新手注意問題小結

    mybatis快速入門學習教程新手注意問題小結

    MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優(yōu)秀的持久層框架。接下來通過本文給大家介紹mybatis快速入門學習教程新手注意問題小結,需要的朋友可以參考下
    2017-02-02
  • SpringMVC @RequestBody的使用解析

    SpringMVC @RequestBody的使用解析

    這篇文章主要介紹了SpringMVC @RequestBody的使用解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論