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

使用Feign設(shè)置Token鑒權(quán)調(diào)用接口

 更新時(shí)間:2022年03月15日 08:44:41   作者:宋忠瑾  
這篇文章主要介紹了使用Feign設(shè)置Token鑒權(quán)調(diào)用接口,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Feign設(shè)置Token鑒權(quán)調(diào)用接口

聲明FeignClient 指定url

/**
?* CREATE BY songzhongjin ON 2021.05.08 15:58 星期六
?* DESC:feign方式 測(cè)試Deom
?*/
@FeignClient(name = "testService", url = "http://xxxxxx:8088")
public interface FeignTest {
? ? /**
? ? ?* 通過(guò)feign調(diào)用接口
? ? ?* @param map
? ? ?* @return
? ? ?*/
? ? @PostMapping(value = "/xxxxx/sys/login")
? ? String login(Map<String, Object> map);
}

調(diào)用測(cè)試

/**
?* CREATE BY songzhongjin ON 2021.05.08 16:02 星期六
?* DESC:
?*/
@RestController
public class Test {
? ? @Autowired
? ? FeignTest feignTest;
? ? @Autowired
? ? MetaDataService metaDataService;
? ? @PostMapping("/test")
? ? public void test() {
? ? ? ? HashMap<String, Object> map = new HashMap<>();
? ? ? ? map.put("user_id", "xxx");
? ? ? ? map.put("password", "xxxxx");
? ? ? ? //調(diào)用 T 具體對(duì)象具體封裝?
? ? ? ? MetaDataResponseVO<T> login = feignTest.login(map);
? ? ? ? List<T> data = login.getData();
? ? ? ? System.out.println(login.getData());
? ? ? ? //處理業(yè)務(wù)data
? ? }
}

返回對(duì)象可以封裝demo

@Data
public class MetaDataResponseVO<T> implements Serializable {
? ? private static final long serialVersionUID = 316492198399615153L;
? ? /**
? ? ?* 狀態(tài)碼.
? ? ?*/
? ? private String retcode;
? ? /**
? ? ?* 狀態(tài)碼描述.
? ? ?*/
? ? private String retmsg;
? ? /**
? ? ?* 響應(yīng)包體.
? ? ?*/
? ? private List<T> data;
}

設(shè)置token 進(jìn)行調(diào)用,F(xiàn)eign 的請(qǐng)求攔截器來(lái)統(tǒng)一添加請(qǐng)求頭信息

先去implements RequestInterceptor 重寫(xiě)apply方法

/**
?* feign攔截器配置,調(diào)用前先鑒權(quán).
?*/
@Component
public class MetaDataFeignConfig implements RequestInterceptor {
??? ?public FeignBasicAuthRequestInterceptor() {
? ? }
? ? /**
? ? ?* 給feign請(qǐng)求加上accessToken請(qǐng)求頭.
? ? ?*
? ? ?* @param template
? ? ?*/
? ? @Override
? ? public void apply(RequestTemplate template) {
? ? ? ? //feign加請(qǐng)求頭 自定義fangjia.auth.token"
? ? ? ? template.header("access_token", System.getProperty("fangjia.auth.token"));
? ? }
}

配置攔截器

攔截器需要在 Feign 的配置中定義,代碼如下所示。

@Configuration
public class FeignConfiguration {
? ? /**
? ? ?* 日志級(jí)別
? ? ?*
? ? ?* @return
? ? ?*/
? ? @Bean
? ? Logger.Level feignLoggerLevel() {
? ? ? ? return Logger.Level.FULL;
? ? }
? ? /**
? ? ?* 創(chuàng)建 Feign 請(qǐng)求攔截器, 在發(fā)送請(qǐng)求前設(shè)置認(rèn)證的 Token, 各個(gè)微服務(wù)將 Token 設(shè)置 到環(huán)境變量中來(lái)達(dá)到通用的目的
? ? ?*
? ? ?* @return
? ? ?*/
? ? @Bean
? ? public FeignBasicAuthRequestInterceptor basicAuthRequestInterceptor() {
? ? ? ? return new FeignBasicAuthRequestInterceptor();
? ? }
}

上面的準(zhǔn)備好之后,我們只需要在調(diào)用業(yè)務(wù)接口之前先調(diào)用認(rèn)證接口,然后將獲取到的 Token 設(shè)置到環(huán)境變量中,通過(guò) System.setProperty(“fangjia.auth.token”,token) 設(shè)置值,可以使用redis存放避免每次調(diào)用。

? ? @Value("${feign-client.meta-data.user}")
? ? private String userId;
? ? @Value("${feign-client.meta-data.password}")
? ? private String password;
? ? private static final String METADATA_ACCESS_TOKEN = "metaDataAccessToken";
? ? /**
? ? ?* 獲取token,設(shè)置到上下文.
? ? ?*/
? ? public void signInMetaData() {
? ? ? ? //拿緩存
? ? ? ? String accessToken = redisUtils.get(METADATA_ACCESS_TOKEN);
? ? ? ? log.warn("-----------從redis拿meta的token結(jié)果--token ={}-------------", accessToken);
? ? ? ? //System.setProperty("fangjia.metadata.token",token) 設(shè)置token值
? ? ? ? System.setProperty("feign.metadata.token", accessToken);
? ? ? ? log.warn("--------------設(shè)置metaData接口鑒權(quán)結(jié)束-----------------");
? ? }

token設(shè)置完成,我們需要在我們其他的feign文件中配置這個(gè)token,

注意配置對(duì)應(yīng)的攔截器configuration ,MetaDataFeignConfig.class這個(gè)類(lèi)就是我們?cè)O(shè)置頭信息的

@FeignClient(name = “metaDataClient”, url = “${feign-client.meta-data.url}”, configuration = MetaDataFeignConfig.class)
package com.infinitus.dmm.openapi;
/**
?* 無(wú)限極元數(shù)據(jù)接口.
?*
?* @author 林志鵬
?* @date 2021/5/7
?*/
@FeignClient(name = "metaDataClient", url = "${feign-client.meta-data.url}", configuration = MetaDataFeignConfig.class)
public interface MetaDataClient {
? ? /**
? ? ?* 拉取物理系統(tǒng)列表.
? ? ?*/
? ? @RequestMapping(value = "/sc/mtdsystemlist", method = RequestMethod.GET)
? ? MetaDataResponseVO<MetaDataSystem> pullPhysicalSystemList();

我們?cè)谡{(diào)用該業(yè)務(wù)接口時(shí)候,需要先去調(diào)用設(shè)置頭信息feign,在調(diào)用業(yè)務(wù)feign。

?/**
? ? ?* 拉取物理系統(tǒng)列表.
? ? ?*
? ? ?* @return
? ? ?*/
? ? public List<MetaDataSystem> pullPhysicalSystem() {
? ? ? ? //鑒權(quán)feign
? ? ? ? signInMetaData();
? ? ? ? //業(yè)務(wù)feign
? ? ? ? MetaDataResponseVO<MetaDataSystem> responseVO = metaDataClient.pullPhysicalSystemList();
? ? ? ? if (Objects.nonNull(responseVO)) {
? ? ? ? ? ? List<MetaDataSystem> data = responseVO.getData();
? ? ? ? ? ? if (Objects.nonNull(data) && !data.isEmpty()) {
? ? ? ? ? ? ? ? return data;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return new ArrayList<>();
? ? }

補(bǔ)充

經(jīng)過(guò)測(cè)試 鑒權(quán)接口調(diào)用成功,但是業(yè)務(wù)接口返回竟然超過(guò)10s feign默認(rèn)的返回1秒就會(huì)觸發(fā)熔斷機(jī)制,所以我們需要設(shè)置feign的超時(shí)時(shí)間,可以指定FeignClient 名name 很人性化。

@FeignClient(name = “metaDataClient”, url = “${feign-client.meta-data.url}”)
#給metaDataClient服務(wù)設(shè)置超時(shí)時(shí)間 這里metaDataClient是我自己,全局的話metaDataClient替換default
feign:
? client:
? ? config:
? ? ? metaDataClient:
? ? ? ? connect-timeout: 50000
? ? ? ? read-timeout: 50000
? hystrix:
? ? enabled: false

Feign調(diào)用進(jìn)行Token鑒權(quán)

項(xiàng)目場(chǎng)景

這邊使用 兩個(gè)springboot應(yīng)用,中間通過(guò)feign來(lái)進(jìn)行遠(yuǎn)程調(diào)用(是的沒(méi)錯(cuò),架構(gòu)就是這么奇葩)。然后在調(diào)用feign的時(shí)候,希望可以進(jìn)行token鑒權(quán)。

解決辦法

請(qǐng)求進(jìn)來(lái)時(shí),通過(guò)攔截器,校驗(yàn)header的token,然后在業(yè)務(wù)中調(diào)用feignClient時(shí),通過(guò)新加一個(gè)feign攔截器,攔截feign請(qǐng)求,把當(dāng)前的header中的token添加到feign的請(qǐng)求頭中去。實(shí)現(xiàn)token在鏈路中的傳遞。

具體實(shí)現(xiàn)

新增 feign 攔截器配置

/**
?* Feign請(qǐng)求攔截器配置.
?*
?* @author linzp
?* @version 1.0.0
?* @date 2021/4/16 21:19
?*/
@Configuration
public class FeignInterceptorConfig implements RequestInterceptor {
? ? public FeignInterceptorConfig() {}
? ? @Override
? ? public void apply(RequestTemplate template) {
? ? ? ? ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
? ? ? ? HttpServletRequest request = attributes.getRequest();
? ? ? ? //設(shè)置token到請(qǐng)求頭
? ? ? ? template.header(ConstantCommon.HEADER_TOKEN_KEY, request.getHeader(ConstantCommon.HEADER_TOKEN_KEY));
? ? }
}

然后在feignClient接口中,添加 == configuration = FeignInterceptorConfig.class==

注意有Bug?。?!

注意?。?!,這里會(huì)有個(gè)異常,獲取到的request會(huì)是null。原因是hytrix隔離策略是thread,無(wú)法讀到 threadLocal變量。

解決辦法?。「牟呗?/strong>

在配置文件中新增如下配置,即可解決!

# 更換hystrix策略,解決無(wú)法傳遞threadLocal變量問(wèn)題
hystrix:
? ? command:
? ? ? ? default:
? ? ? ? ? ? execution:
? ? ? ? ? ? ? ? isolation:
? ? ? ? ? ? ? ? ? ? strategy: SEMAPHORE

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java實(shí)現(xiàn)圖形化界面計(jì)算器

    java實(shí)現(xiàn)圖形化界面計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)圖形化界面計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 為什么不要使用 async void的原因分析

    為什么不要使用 async void的原因分析

    這篇文章主要介紹了為什么不要使用 async void的原因分析及解決方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • 帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之哈希表

    帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之哈希表

    這篇文章主要為大家介紹了Java數(shù)據(jù)結(jié)構(gòu)和算法之哈希表,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • springboot接收J(rèn)SON實(shí)現(xiàn)示例解析

    springboot接收J(rèn)SON實(shí)現(xiàn)示例解析

    這篇文章主要為大家介紹了springboot如何接收J(rèn)SON的實(shí)現(xiàn)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Java中Integer方法實(shí)例詳解

    Java中Integer方法實(shí)例詳解

    這篇文章主要給大家介紹了關(guān)于Java中Integer方法的相關(guān)資料,Java中的Integer是int的包裝類(lèi)型,文中通過(guò)代碼實(shí)例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • MyBatis 配置之集合的嵌套方式

    MyBatis 配置之集合的嵌套方式

    這篇文章主要介紹了MyBatis 配置之集合的嵌套方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 深入理解SpringBoot事務(wù)傳播機(jī)制

    深入理解SpringBoot事務(wù)傳播機(jī)制

    本文介紹了SpringBoot中事務(wù)傳播機(jī)制的原理及其常用配置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • Mybatis實(shí)現(xiàn)批量操作8種小結(jié)

    Mybatis實(shí)現(xiàn)批量操作8種小結(jié)

    本文對(duì)Mybatis的五種批處理方式進(jìn)行了性能測(cè)試,包括批量新增和批量修改,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • JVM虛擬機(jī)的類(lèi)加載機(jī)制詳解

    JVM虛擬機(jī)的類(lèi)加載機(jī)制詳解

    這篇文章主要介紹了JVM虛擬機(jī)的類(lèi)加載機(jī)制詳解,類(lèi)是在運(yùn)行期間第一次使用時(shí)動(dòng)態(tài)加載的,而不是一次性加載所有類(lèi),因?yàn)槿绻淮涡约虞d,那么會(huì)占用很多的內(nèi)存,需要的朋友可以參考下
    2023-12-12
  • 使用@PropertySource讀取配置文件通過(guò)@Value進(jìn)行參數(shù)注入

    使用@PropertySource讀取配置文件通過(guò)@Value進(jìn)行參數(shù)注入

    這篇文章主要介紹了使用@PropertySource讀取配置文件通過(guò)@Value進(jìn)行參數(shù)注入,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評(píng)論

平果县| 安吉县| 浑源县| 潮州市| 沁水县| 友谊县| 徐州市| 潢川县| 安丘市| 石城县| 金乡县| 遂昌县| 湖州市| 罗山县| 许昌市| 九寨沟县| 祁连县| 彰化市| 东海县| 正镶白旗| 股票| 金秀| 巧家县| 乐昌市| 肇源县| 千阳县| 方山县| 定西市| 苗栗市| 全椒县| 西贡区| 娄烦县| 芮城县| 全椒县| 祁连县| 苏尼特左旗| 安福县| 台中县| 乡宁县| 扬中市| 遂昌县|