日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

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

瀏覽:15日期:2023-08-12 10:05:31

一、需求

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

二、尋找解決途徑

1、參考官方文檔

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

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

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

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

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

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

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

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

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

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

@Overridepublic GatewayFilter apply(NameValueConfig config) {return new GatewayFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange,GatewayFilterChain chain) {URI uri = exchange.getRequest().getURI();StringBuilder query = new StringBuilder();//獲取請求uri的請求參數(shù)(GET請求參數(shù)通過拼接key=value形式進行傳參) String originalQuery = uri.getRawQuery(); //判斷最后一個字符是否是&,如果不是則拼接一個&,以備后續(xù)的參數(shù)進行連接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)通過注釋進行說明。

那config中的key:value又是如何傳遞進來的呢?

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

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

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

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

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

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

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

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

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

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

2、參考官方實現(xià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的屬性和值,以備后面進行傳遞參數(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去獲取緩存中的用戶登陸信息,然后依次拼接對應的屬性和值即可。

四、自定義filter的應用。

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

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

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

default-filters: - AccountRequestParameter=k, v

因為我是全局使用的,所以使用的是default-filters進行配置

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

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

至此,我們自定義請求參數(shù)封裝完成!!!

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

標簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久国际精品| 国产精品一线| 日韩在线观看中文字幕| 国内揄拍国内精品久久| 婷婷综合激情| 91精品国产一区二区在线观看 | 日韩在线播放一区二区| 久久免费精品| 午夜宅男久久久| 你懂的亚洲视频| 日韩一级精品| 国产一区调教| 亚洲tv在线| 久久精品国产大片免费观看| 91亚洲无吗| 亚洲综合不卡| 伊人久久在线| 国产亚洲一区二区三区啪| 久久国产小视频| 欧美日韩一区二区国产| 九一国产精品| 激情综合婷婷| 日韩精品亚洲aⅴ在线影院| 欧美亚洲国产激情| 精品一区二区三区四区五区| 在线精品国产亚洲| 99久久激情| 丰满少妇一区| 久久国际精品| 亚洲男人在线| 亚洲成人精选| 热三久草你在线| 国产精品99久久免费| 麻豆精品网站| 日韩欧美1区| 久久99久久人婷婷精品综合| 五月亚洲婷婷 | 蜜桃视频在线观看一区| 999国产精品视频| 国产不卡一区| 国产精品115| 日本国产亚洲| 在线一区二区三区视频| 黄色成人精品网站| 欧美精选视频一区二区| 日韩成人免费| 国产剧情一区| 亚洲精品无播放器在线播放| 欧美日韩精品一本二本三本| 国产欧洲在线| 国产成人精品一区二区免费看京| 欧美在线首页| 亚洲精品在线a| 三级一区在线视频先锋| 夜久久久久久| 欧美在线网站| 91久久国产| 久久麻豆精品| 中文字幕系列一区| 日韩大片在线| 国产乱码午夜在线视频| 97精品一区| 久久久久亚洲精品中文字幕| 久久99精品久久久久久园产越南 | 亚洲精品第一| 最新国产精品视频| 视频一区二区三区在线| 免费欧美在线视频| 蜜臀久久99精品久久久画质超高清 | 男人的天堂亚洲一区| 免费视频亚洲| 国户精品久久久久久久久久久不卡| 日韩和的一区二在线| 日韩天堂在线| 日韩毛片在线| av亚洲在线观看| 红桃视频国产一区| 亚洲综合日韩| 亚洲精品激情| 欧美精品中文字幕亚洲专区| 欧美精品国产一区| 国产精品欧美一区二区三区不卡 | 国产精品视频一区二区三区 | 国产欧美久久一区二区三区| 国产麻豆精品| 国产一区福利| 999久久久亚洲| 尤物在线精品| 中文字幕一区二区三区四区久久| 四虎在线精品| 国产精品欧美日韩一区| 久久伊人亚洲| 亚洲日本网址| 国产视频欧美| 天海翼精品一区二区三区| 97久久亚洲| 麻豆免费精品视频| 日韩精品dvd| 黄色av日韩| 日韩在线黄色| 久久中文精品| 香蕉精品视频在线观看| 亚洲理论在线| 欧美国产极品| 国产尤物精品| 亚洲影视一区二区三区| 国产日韩欧美一区在线| 91一区二区| 免费久久精品| 日韩福利视频网| 麻豆国产精品| 激情综合网站| 日本91福利区| 精品视频黄色| 免费久久精品| 国产亚洲久久| 日韩精品欧美| 亚洲永久精品唐人导航网址| 美女久久久久久| 999久久久免费精品国产| 亚洲区国产区| 亚洲国产成人二区| 日韩中文字幕一区二区三区| 国产欧美91| 麻豆视频在线看| 婷婷综合六月| 激情欧美一区二区三区| 久久久久97| 国产精品亚洲人成在99www| 日韩激情综合| 97久久亚洲| 日韩国产激情| 成人在线黄色| 不卡视频在线| 亚洲理论在线| 国内精品伊人| 午夜国产欧美理论在线播放 | 国产精品亚洲人成在99www| 精品欧美日韩精品| 久久超级碰碰| 精品国产18久久久久久二百| 亚洲永久字幕| 久久精品国产网站| 亚洲欧美日韩在线观看a三区| 久久久免费人体| 亚洲一区日韩| 成人福利视频| 欧美片第1页综合| 自由日本语亚洲人高潮| 久久精品福利| 日本成人精品| 国产91久久精品一区二区| 青青草国产精品亚洲专区无| 久久激情中文| 国产精品玖玖玖在线资源| 欧美精品一区二区久久| 国产精东传媒成人av电影| 在线视频精品| 久久久久久网| 久久精品99国产精品日本| 午夜视频精品| 国产suv精品一区二区四区视频 | 日韩欧美另类一区二区| 日韩二区在线观看| 夜夜嗨网站十八久久| xxxxx性欧美特大| 国产欧美午夜| 亚洲精品综合| 在线视频观看日韩| 精品久久精品| 欧美在线不卡| 一区二区三区午夜视频| 亚洲网站视频| а√天堂8资源中文在线| 国产精品久久久免费| 亚洲三区欧美一区国产二区| 欧美午夜精品一区二区三区电影| 蜜桃久久久久| 奇米777国产一区国产二区| 午夜一级久久| 狠狠色狠狠色综合日日tαg| 欧洲一级精品| 国产suv精品一区二区四区视频| 欧美精品国产白浆久久久久| 亚洲精品精选| 蜜桃久久av| 尤物网精品视频| 激情综合网五月| 久久人人99| 成人午夜精品| 激情国产在线| 国产精品yjizz视频网| 国产精品theporn| 国产欧美日韩精品一区二区三区 | 精品不卡一区| 久久精品系列| 久草精品视频| 国产精品99一区二区三区| 国产福利一区二区精品秒拍| 国产日韩中文在线中文字幕|