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

Spring Gateway自定義請求參數(shù)封裝的實現(xiàn)示例

 更新時間:2020年09月25日 09:32:51   作者:喬丁  
這篇文章主要介紹了Spring Gateway自定義請求參數(shù)封裝的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、需求

在使用spring gateway作為網(wǎng)關(guān)時,我們需要在經(jīng)過網(wǎng)關(guān)的請求中添加一些需要傳遞給后續(xù)服務(wù)的公共參數(shù),這個時候就可以用到spring gateway提供的自定義請求參數(shù)功能了。

二、尋找解決途徑

 1、參考官方文檔

我們可以猜測,spring gateway作為網(wǎng)關(guān)功能,肯定會提供很多處理請求參數(shù)的功能,于是我們查詢文檔得到如下內(nèi)容:

 

2、探索GatewayFilterFactory實現(xiàn)規(guī)律

  • 通過查詢spring官方文檔可以看到,spring gateway為我們提供了很多xxxGatewayFilterFactory,而這些factory都有相同點,都是以GatewayFilterFactory結(jié)尾的。
  • 在類名中,我們可以根據(jù)類名進(jìn)行大膽的猜測,前面的幾個單詞是描述他的功能的。
  • 右側(cè)的yml配置文件可以看到,filter的配置也是呈現(xiàn)出一定的規(guī)律的。

3、從源碼獲取實現(xiàn)原理

既然我們是要解決自定義請求參數(shù)封裝問題,那么我們通過上面描述規(guī)律,可以很大膽的猜測AddRequestParameteGatewayFilterFactory就是我們要找的目標(biāo)。那么我們查看一下他的源碼,看看他是如何實現(xiàn)的。

首先看看AddRequestParameteGatewayFilterFactory的繼承關(guān)系,大概了解一下他的組成

從繼承關(guān)系來看,還是比較復(fù)雜,有點懵逼,那直接進(jìn)入代碼看看他的實現(xiàn)。

我們只粘貼比較核心的代碼進(jìn)行分析,其他代碼暫時不用關(guān)心。

@Override
	public GatewayFilter apply(NameValueConfig config) {
		return new GatewayFilter() {
			@Override
			public Mono<Void> filter(ServerWebExchange exchange,
					GatewayFilterChain chain) {
				URI uri = exchange.getRequest().getURI();
				StringBuilder query = new StringBuilder();
				//獲取請求uri的請求參數(shù)(GET請求參數(shù)通過拼接key=value形式進(jìn)行傳參)
    String originalQuery = uri.getRawQuery(); 
    
				//判斷最后一個字符是否是&,如果不是則拼接一個&,以備后續(xù)的參數(shù)進(jìn)行連接
				if (StringUtils.hasText(originalQuery)) {
					query.append(originalQuery);
					if (originalQuery.charAt(originalQuery.length() - 1) != '&') {
						query.append('&');
					}
				}
				//獲取config中的key、value,然后拼接到uri請求參數(shù)后面
				String value = ServerWebExchangeUtils.expand(exchange, config.getValue());
				// TODO urlencode?
				query.append(config.getName());
				query.append('=');
				query.append(value);
				//把請求參數(shù)重新拼接回去,并放入request中傳遞到過濾鏈的下一個請求中去
				try {
					URI newUri = UriComponentsBuilder.fromUri(uri)
							.replaceQuery(query.toString()).build(true).toUri();

					ServerHttpRequest request = exchange.getRequest().mutate().uri(newUri)
							.build();

					return chain.filter(exchange.mutate().request(request).build());
				}
				catch (RuntimeException ex) {
					throw new IllegalStateException(
							"Invalid URI query: \"" + query.toString() + "\"");
				}
			}

此方法是用于封裝請求參數(shù)的具體實現(xiàn),代碼的具體實現(xiàn)步驟已經(jīng)通過注釋進(jìn)行說明。

config中的key:value又是如何傳遞進(jìn)來的呢?

4、filter的配置和參數(shù)傳遞

代碼實現(xiàn)中出現(xiàn)了config參數(shù)的封裝,那這個參數(shù)是如何獲得的呢?這時候我們就要去查看這個filter是如何使用的了。

  • 從圖中可以看到,我們的filter就是在這個配置文件中配置使用的。那為什么配置文件中只有AddRequestParameter配置,而不是AddRequestParameterGatewayFilterFactory呢???
  • 其實這是spring的一種約定,實現(xiàn)了GatewayFilterFactory接口的類在配置使用的時候,需要省略掉后面的GatewayFilterFactory,僅配置前綴即可。
  • 同時,配置文件中的red,blue又是做什么的???
  • 這就是我們需要傳遞的請求參數(shù)了,他以key=red,value=blue的方式進(jìn)行配置。
  • 然后spring會幫我們把這個鍵值傳入到上面的apply方法的config中。我們通過config的源碼就能看到究竟:

可以看到,config類的實現(xiàn)就是一個namevalue,分別對應(yīng)了配置文件中的兩個參數(shù)。

三、基于官方實現(xiàn)進(jìn)行自定義拓展

我們看到,spring利用同種方式,實現(xiàn)了各種filter。但如果這些都不能滿足我們的要求,那該怎么辦???

1、自定義參數(shù)慘景預(yù)設(shè)

我們現(xiàn)在看到的參數(shù)信息都是寫死在配置文件中的,無法進(jìn)行動態(tài)參數(shù)的傳遞。我們可以設(shè)想一個很普通的場景: 我們需要把用戶的登錄信息封裝到請求參數(shù)中,供其他服務(wù)使用。那這又該如何實現(xiàn)呢???

2、參考官方實現(xiàn)進(jìn)行自定義

其實如果我們只要模仿官方實現(xiàn),在uri上拼接我們要傳遞的動態(tài)參數(shù)就可以了。具體實現(xiàn)如下:

 @Override
   public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    URI uri = exchange.getRequest().getURI();
    StringBuilder query = new StringBuilder();
    String originalQuery = uri.getRawQuery();

    if (StringUtils.hasText(originalQuery)) {
     query.append(originalQuery);
     if (originalQuery.charAt(originalQuery.length() - 1) != '&') {
      query.append('&');
     }
    }

    String value = ServerWebExchangeUtils.expand(exchange, config.getValue());
    // TODO urlencode?
    query.append(config.getName());
    query.append('=');
    query.append(value);

    //獲取redis中用戶的緩存信息,拼接到請求參數(shù)后面
    String token = exchange.getRequest().getHeaders().getFirst("token");
    if (StringUtils.hasText(token)) {
     AccountEntity accountEntity = accountAdminApiService.loginAccountAdmin(token);
     //通過發(fā)射拿到bean的屬性和值,以備后面進(jìn)行傳遞參數(shù)拼接
     Map<String, Object> beanMap = beanValue(accountEntity);
     if (!CollectionUtils.isEmpty(beanMap)) {
      for (String key : beanMap.keySet()) {
       query.append('&').append(key).append('=').append(beanMap.get(key));
      }
     }
    }

    //以下與官方代碼一樣,省略...
   }

在固定傳參參數(shù)拼接后面,直接通過token去獲取緩存中的用戶登陸信息,然后依次拼接對應(yīng)的屬性和值即可。

四、自定義filter的應(yīng)用。

網(wǎng)上看了很多人寫的自定義,其實和本文差不多。但是有點沒有提到,定義好了怎么用啊???

通過使用注解@bean的方式進(jìn)行配置,具體可以自己百度。

這里用一個簡易的配置,套用yml配置的規(guī)律,直接在配置文件中配置。

default-filters:
  - AccountRequestParameter=k, v

因為我是全局使用的,所以使用的是default-filters進(jìn)行配置

此外還應(yīng)該注意,此時自定的filter并不會被spring boot加載,所以在啟動的時候會報錯。

解決辦法:此時還要在對應(yīng)的類上加上注解@Component,把bean交給spring管理。

至此,我們自定義請求參數(shù)封裝完成?。。?/strong>

到此這篇關(guān)于Spring Gateway自定義請求參數(shù)封裝的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)Spring Gateway自定義請求參數(shù)封裝內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis plus in方法使用說明

    mybatis plus in方法使用說明

    這篇文章主要介紹了mybatis plus in方法使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • SpringBoot SpringEL表達(dá)式的使用

    SpringBoot SpringEL表達(dá)式的使用

    本文主要介紹了SpringEL表達(dá)式的使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • java.exe和javaw.exe的區(qū)別及使用方法

    java.exe和javaw.exe的區(qū)別及使用方法

    這篇文章主要介紹了java.exe和javaw.exe的區(qū)別及使用方法,需要的朋友可以參考下
    2014-04-04
  • Java 添加數(shù)字簽名到excel及檢測,刪除簽名

    Java 添加數(shù)字簽名到excel及檢測,刪除簽名

    這篇文章主要介紹了Java 添加數(shù)字簽名到excel及檢測,刪除簽名的方法,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-04-04
  • Java壓縮和解壓縮ZIP文件實戰(zhàn)案例

    Java壓縮和解壓縮ZIP文件實戰(zhàn)案例

    這篇文章主要給大家介紹了關(guān)于Java壓縮和解壓縮ZIP文件的相關(guān)資料,ZIP是一種較為常見的壓縮形式,最近項目中遇到了再Java中壓縮和解壓縮zip文件的需求,特此分享給大家,需要的朋友可以參考下
    2023-07-07
  • MyBatis動態(tài)sql查詢及多參數(shù)查詢方式

    MyBatis動態(tài)sql查詢及多參數(shù)查詢方式

    這篇文章主要介紹了MyBatis動態(tài)sql查詢及多參數(shù)查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • IDEA解決springboot熱部署失效問題(推薦)

    IDEA解決springboot熱部署失效問題(推薦)

    熱部署,就是在應(yīng)用正在運行的時候升級軟件,卻不需要重新啟動應(yīng)用。這篇文章主要介紹了IDEA解決springboot熱部署失效問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Java Stream中自定義Collector實現(xiàn)復(fù)雜數(shù)據(jù)收集的方法

    Java Stream中自定義Collector實現(xiàn)復(fù)雜數(shù)據(jù)收集的方法

    Java Stream API中的Collector接口是一個強(qiáng)大的工具,它允許我們自定義數(shù)據(jù)收集、轉(zhuǎn)換和聚合的過程,,本文介紹了Java Stream中自定義Collector實現(xiàn)復(fù)雜數(shù)據(jù)收集方法,需要的朋友可以參考下
    2024-08-08
  • Java獲取Class對象的幾種方式小結(jié)

    Java獲取Class對象的幾種方式小結(jié)

    本文給大家分享了Java獲取Class對象的幾種方式,使用類名.class 語法,使用對象的 getClass()方法,使用 Class.forName()方法等多種方法,不同的方式適用于不同的場景,需要的朋友可以參考下
    2023-10-10
  • Spring Mybatis Mapper模糊查詢的幾種方法

    Spring Mybatis Mapper模糊查詢的幾種方法

    在Spring結(jié)合Mybatis進(jìn)行開發(fā)時,實現(xiàn)模糊查詢是一個常見需求,在Mybatis中,LIKE查詢可以通過多種方式實現(xiàn),本文給大家介紹了Spring Mybatis Mapper模糊查詢的幾種方法,需要的朋友可以參考下
    2024-03-03

最新評論

瓦房店市| 阆中市| 台中市| 尉犁县| 呼和浩特市| 扎囊县| 固阳县| 马鞍山市| 扎赉特旗| 枝江市| 平谷区| 耒阳市| 读书| 永德县| 遂昌县| 乐东| 伊宁市| 万盛区| 阳谷县| 汉寿县| 永福县| 福贡县| 新沂市| 镇坪县| 棋牌| 远安县| 镇赉县| 汾西县| 承德市| 阿坝| 祁连县| 安乡县| 包头市| 即墨市| 磴口县| 普宁市| 安泽县| 磴口县| 东源县| 武安市| 都匀市|