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

Spring Cloud Feign請(qǐng)求添加headers的實(shí)現(xiàn)方式

 更新時(shí)間:2023年04月26日 17:05:26   作者:clonechen2021  
這篇文章主要介紹了Spring Cloud Feign請(qǐng)求添加headers的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

背景

部門技術(shù)升級(jí),HttpClient需要升級(jí)Feign調(diào)用,重構(gòu)某一個(gè)資方時(shí)遇到請(qǐng)求需要添加上自定義簽名headers,踩坑后記錄了下來

方案一

方法上的@RequestMapping注解添加headers信息

@RequestMapping注解的屬性中包含一個(gè)headers數(shù)組,所以嘗試使用,在指定的方法上@RequestMapping注解中添加需要的headers,可以是寫死的,也可以讀取配置,測試是有效的

同理@RequestMapping一組的@PostMapping,@GetMapping注解等均適用

@FeignClient(name = "server",url = "127.0.0.1:8080")
public interface FeignTest {
? ? @RequestMapping(value = "/test",headers = {"app=test-app","token=${test-app.token}"})
? ? String test();
}

方案二

接口上的@RequestMapping注解添加headers信息

針對(duì)單個(gè)方法可以在方法上的@RequestMapping注解中添加headers,如果同一個(gè)接口中所有的方法都需要同樣的headers時(shí)在方法上加就比較繁瑣了,可以在接口上的@RequestMapping注解中添加headers,使整個(gè)接口的方法均被添加同樣的headers

@FeignClient(name = "server",url = "127.0.0.1:8080")
@RequestMapping(value = "/",headers = {"app=test-app","token=${test-app.token}"})
public interface FeignTest {
? ? @RequestMapping(value = "/test")
? ? String test();
}

方案三

使用@Headers注解添加headers信息

@FeignClient(name = "server",url = "127.0.0.1:8080")
@Headers({"app: test-app","token: ${test-app.token}"})
public interface FeignTest {
? ? @RequestMapping(value = "/test")
? ? String test();
}

查看openfeign官方文檔發(fā)現(xiàn)其使用的是@Headers來添加headers,測試發(fā)現(xiàn)并沒有生效,spring cloud使用了自己的SpringMvcContract來解析注解,所以需要自己實(shí)現(xiàn)一個(gè)Contract來實(shí)現(xiàn)對(duì)@Headers注解的支持,具體實(shí)現(xiàn)參照http://www.dbjr.com.cn/article/282530.htm

方案四

自定義RequestInterceptor添加headers信息

feign提供了一個(gè)攔截器接口RequestInterceptor,實(shí)現(xiàn)RequestInterceptor接口就可以實(shí)現(xiàn)對(duì)feign請(qǐng)求的攔截,接口提供了一個(gè)方法apply(),實(shí)現(xiàn)apply()方法

@Component
public class FeignRequestInterceptor implements RequestInterceptor {

? ? @Value("${test-app.token}")
? ? private String token;
? ??
? ? @Override
? ? public void apply(RequestTemplate requestTemplate) {
? ? ? ? requestTemplate.header("app","test-app");//靜態(tài)
? ? ? ? requestTemplate.header("token",token);//讀配置
? ? }
}

實(shí)現(xiàn)apply()方法直接添加header會(huì)攔截所有的請(qǐng)求都加上headers,如果不是所有的feign請(qǐng)求都需要用到不建議此方法

方案五

自定義RequestInterceptor實(shí)現(xiàn)添加動(dòng)態(tài)數(shù)據(jù)到header

以上方案都不適合把動(dòng)態(tài)的數(shù)據(jù)放入headers中,而通常場景下可能經(jīng)常需要把計(jì)算的簽名,用戶id等動(dòng)態(tài)信息設(shè)置到headers,所以還需要一個(gè)更加完善的方案。

方案1/2/3均不能設(shè)置動(dòng)態(tài)的值,方案4可以設(shè)置動(dòng)態(tài)值,但是沒做到請(qǐng)求的區(qū)分,所以在方案4的基礎(chǔ)上進(jìn)行改進(jìn)得到了較為完善的方案5。

具體實(shí)現(xiàn)如下:

在請(qǐng)求調(diào)用代碼中,獲取到HttpServletRequest對(duì)象,將需要添加到headers中的值封裝成一個(gè)map后放入HttpServletRequest的attribute域中

ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = Objects.requireNonNull(attributes).getRequest();
String signedMsg = getSignedMsg(reqJson); // 計(jì)算簽名字符串
Map<String, String> reqMap = new HashMap<>();
reqMap.put("content-type", "application/json");//常量字段
reqMap.put("accessKey", accessKey);//常量字段
reqMap.put("signedMsg", signedMsg);//動(dòng)態(tài)計(jì)算/獲取字段
request.setAttribute("customizedRequestHeader", reqMap);

在自定義RequestInterceptor中獲取到HttpServletRequest對(duì)象的attribute域中指定的key,將key對(duì)應(yīng)map中的所有參數(shù)加入到headers。

@Component
public class FeignRequestInterceptor implements RequestInterceptor {

? ? @Override
? ? public void apply(RequestTemplate requestTemplate) {
? ? ? ? ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
? ? ? ? HttpServletRequest request = attributes.getRequest();

? ? ? ? // 設(shè)置自定義header
? ? ? ? // 設(shè)置request中的attribute到header以便轉(zhuǎn)發(fā)到Feign調(diào)用的服務(wù)
? ? ? ? Enumeration<String> reqAttrbuteNames = request.getAttributeNames();
? ? ? ? if (reqAttrbuteNames != null) {
? ? ? ? ? ? while (reqAttrbuteNames.hasMoreElements()) {
? ? ? ? ? ? ? ? String attrName = reqAttrbuteNames.nextElement();
? ? ? ? ? ? ? ? if (!"customizedRequestHeader".equalsIgnoreCase(attrName)) {
? ? ? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? Map<String,String> requestHeaderMap = (Map)request.getAttribute(attrName);
? ? ? ? ? ? ? ? for (Map.Entry<String, String> entry : requestHeaderMap.entrySet()) {
? ? ? ? ? ? ? ? ? ? requestTemplate.header(entry.getKey(), entry.getValue());
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

總結(jié)

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

相關(guān)文章

  • JVM類加載之雙親委派機(jī)制解讀

    JVM類加載之雙親委派機(jī)制解讀

    這篇文章主要介紹了JVM類加載之雙親委派機(jī)制解讀,類加載階段分為加載、連接、初始化三個(gè)階段,而加載階段需要通過類的全限定名來獲取定義了此類的二進(jìn)制字節(jié)流,Java特意把這一步抽出來用類加載器來實(shí)現(xiàn),需要的朋友可以參考下
    2023-12-12
  • java工具類實(shí)現(xiàn)文件壓縮zip以及解壓縮功能

    java工具類實(shí)現(xiàn)文件壓縮zip以及解壓縮功能

    這篇文章主要給大家介紹了關(guān)于java工具類實(shí)現(xiàn)文件壓縮zip以及解壓縮功能的相關(guān)資料,文中主要使用使用的是hutool工具類,Hutool是一個(gè)Java工具類庫,由國內(nèi)的程序員loolly開發(fā),目的是提供一些方便、快捷、實(shí)用的工具類和工具方法,需要的朋友可以參考下
    2024-02-02
  • Java動(dòng)態(tài)規(guī)劃之硬幣找零問題實(shí)現(xiàn)代碼

    Java動(dòng)態(tài)規(guī)劃之硬幣找零問題實(shí)現(xiàn)代碼

    這篇文章主要介紹了Java動(dòng)態(tài)規(guī)劃之硬幣找零問題實(shí)現(xiàn)代碼,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Java使用Sharding-JDBC分庫分表進(jìn)行操作

    Java使用Sharding-JDBC分庫分表進(jìn)行操作

    Sharding-JDBC 是無侵入式的 MySQL 分庫分表操作工具,本文主要介紹了Java使用Sharding-JDBC分庫分表進(jìn)行操作,感興趣的可以了解一下
    2021-08-08
  • 避免sql注入_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    避免sql注入_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了避免sql注入,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • MyBatis延遲加載與立即加載案例教程

    MyBatis延遲加載與立即加載案例教程

    這篇文章主要介紹了MyBatis延遲加載與立即加載案例教程,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Java多線程——基礎(chǔ)概念

    Java多線程——基礎(chǔ)概念

    這篇文章主要介紹了java多線程編程實(shí)例,分享了幾則多線程的實(shí)例代碼,具有一定參考價(jià)值,加深多線程編程的理解還是很有幫助的,需要的朋友可以參考下,希望可以幫到你
    2021-07-07
  • Java中字符序列的替換與分解的幾種實(shí)現(xiàn)方法

    Java中字符序列的替換與分解的幾種實(shí)現(xiàn)方法

    本文主要介紹了Java中字符序列的替換與分解的幾種實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Java創(chuàng)建子線程的兩種方法

    Java創(chuàng)建子線程的兩種方法

    這篇文章主要介紹了Java創(chuàng)建子線程的兩種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • JAVAWEB實(shí)現(xiàn)簡單的商城項(xiàng)目(一)實(shí)例代碼解析

    JAVAWEB實(shí)現(xiàn)簡單的商城項(xiàng)目(一)實(shí)例代碼解析

    本文給大家分享一段實(shí)例代碼給大家介紹JAVAWEB實(shí)現(xiàn)簡單的商城項(xiàng)目(一),非常具有參考價(jià)值,感興趣的朋友一起學(xué)習(xí)吧
    2016-02-02

最新評(píng)論