电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Spring Gateway自定義請求參數封裝的實現示例

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

一、需求

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

二、尋找解決途徑

1、參考官方文檔

我們可以猜測,spring gateway作為網關功能,肯定會提供很多處理請求參數的功能,于是我們查詢文檔得到如下內容:

Spring Gateway自定義請求參數封裝的實現示例

2、探索GatewayFilterFactory實現規律

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

3、從源碼獲取實現原理

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

首先看看AddRequestParameteGatewayFilterFactory的繼承關系,大概了解一下他的組成

Spring Gateway自定義請求參數封裝的實現示例

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

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

@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的請求參數(GET請求參數通過拼接key=value形式進行傳參) String originalQuery = uri.getRawQuery(); //判斷最后一個字符是否是&,如果不是則拼接一個&,以備后續的參數進行連接if (StringUtils.hasText(originalQuery)) {query.append(originalQuery);if (originalQuery.charAt(originalQuery.length() - 1) != ’&’) {query.append(’&’);}}//獲取config中的key、value,然后拼接到uri請求參數后面String value = ServerWebExchangeUtils.expand(exchange, config.getValue());// TODO urlencode?query.append(config.getName());query.append(’=’);query.append(value);//把請求參數重新拼接回去,并放入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() + ''');}}

此方法是用于封裝請求參數的具體實現,代碼的具體實現步驟已經通過注釋進行說明。

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

4、filter的配置和參數傳遞

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

Spring Gateway自定義請求參數封裝的實現示例

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

Spring Gateway自定義請求參數封裝的實現示例

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

三、基于官方實現進行自定義拓展

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

1、自定義參數慘景預設

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

2、參考官方實現進行自定義

其實如果我們只要模仿官方實現,在uri上拼接我們要傳遞的動態參數就可以了。具體實現如下:

@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中用戶的緩存信息,拼接到請求參數后面 String token = exchange.getRequest().getHeaders().getFirst('token'); if (StringUtils.hasText(token)) { AccountEntity accountEntity = accountAdminApiService.loginAccountAdmin(token); //通過發射拿到bean的屬性和值,以備后面進行傳遞參數拼接 Map<String, Object> beanMap = beanValue(accountEntity); if (!CollectionUtils.isEmpty(beanMap)) { for (String key : beanMap.keySet()) { query.append(’&’).append(key).append(’=’).append(beanMap.get(key)); } } } //以下與官方代碼一樣,省略... }

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

四、自定義filter的應用。

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

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

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

default-filters: - AccountRequestParameter=k, v

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

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

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

至此,我們自定義請求參數封裝完成?。。?/b>

到此這篇關于Spring Gateway自定義請求參數封裝的實現示例的文章就介紹到這了,更多相關Spring Gateway自定義請求參數封裝內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 广州各区危化证办理_危险化学品经营许可证代办 | 工业洗衣机_工业洗涤设备_上海力净工业洗衣机厂家-洗涤设备首页 bkzzy在职研究生网 - 在职研究生招生信息咨询平台 | 科研ELISA试剂盒,酶联免疫检测试剂盒,昆虫_植物ELISA酶免试剂盒-上海仁捷生物科技有限公司 | 纸张环压仪-纸张平滑度仪-杭州纸邦自动化技术有限公司 | 不锈钢搅拌罐_高速搅拌罐厂家-无锡市凡格德化工装备科技有限公司 | 浙江寺庙设计-杭州寺院设计-宁波寺庙规划_汉匠 | 切铝机-数控切割机-型材切割机-铝型材切割机-【昆山邓氏精密机械有限公司】 | 世纪豪门官网 世纪豪门集成吊顶加盟电话 世纪豪门售后电话 | 河南橡胶接头厂家,河南波纹补偿器厂家,河南可曲挠橡胶软连接,河南套筒补偿器厂家-河南正大阀门 | 闪蒸干燥机-喷雾干燥机-带式干燥机-桨叶干燥机-[常州佳一干燥设备] | 济南保安公司加盟挂靠-亮剑国际安保服务集团总部-山东保安公司|济南保安培训学校 | 盐水蒸发器,水洗盐设备,冷凝结晶切片机,转鼓切片机,絮凝剂加药系统-无锡瑞司恩机械有限公司 | 万博士范文网-您身边的范文参考网站Vanbs.com | 防水套管-柔性防水套管-刚性防水套管-上海执品管件有限公司 | 探伤仪,漆膜厚度测试仪,轮胎花纹深度尺厂家-淄博创宇电子 | 铝合金电阻-无源谐波滤波器-上海稳达电讯设备厂 | 除湿机|工业除湿机|抽湿器|大型地下室车间仓库吊顶防爆除湿机|抽湿烘干房|新风除湿机|调温/降温除湿机|恒温恒湿机|加湿机-杭州川田电器有限公司 | 阜阳在线-阜阳综合门户| 防弹玻璃厂家_防爆炸玻璃_电磁屏蔽玻璃-四川大硅特玻科技有限公司 | UV固化机_UVLED光固化机_UV干燥机生产厂家-上海冠顶公司专业生产UV固化机设备 | 电线电缆厂家|沈阳电缆厂|电线厂|沈阳英联塑力线缆有限公司 | 铝箔袋,铝箔袋厂家,东莞铝箔袋,防静电铝箔袋,防静电屏蔽袋,防静电真空袋,真空袋-东莞铭晋让您的产品与众不同 | 橡胶接头|可曲挠橡胶接头|橡胶软接头安装使用教程-上海松夏官方网站 | 外贮压-柜式-悬挂式-七氟丙烷-灭火器-灭火系统-药剂-价格-厂家-IG541-混合气体-贮压-非贮压-超细干粉-自动-灭火装置-气体灭火设备-探火管灭火厂家-东莞汇建消防科技有限公司 | 外贸网站建设-外贸网站设计制作开发公司-外贸独立站建设【企术】 | HEYL硬度计量泵-荧光法在线溶解氧仪-净时测控技术(上海)有限公司 | 快干水泥|桥梁伸缩缝止水胶|伸缩缝装置生产厂家-广东广航交通科技有限公司 | 脱硫搅拌器厂家-淄博友胜不锈钢搅拌器厂家 | 正压送风机-多叶送风口-板式排烟口-德州志诺通风设备 | 制氮设备_PSA制氮机_激光切割制氮机_氮气机生产厂家-苏州西斯气体设备有限公司 | 振动筛-交叉筛-螺旋筛-滚轴筛-正弦筛-方形摇摆筛「新乡振动筛厂家」 | 多功能三相相位伏安表-变压器短路阻抗测试仪-上海妙定电气 | 标准品网_标准品信息网_【中检计量】| sus630/303cu不锈钢棒,440C/430F/17-4ph不锈钢研磨棒-江苏德镍金属科技有限公司 | 彩超机-黑白B超机-便携兽用B超机-多普勒彩超机价格「大为彩超」厂家 | 超声波清洗机_细胞破碎仪_实验室超声仪器_恒温水浴-广东洁盟深那仪器 | 儋州在线-儋州招聘找工作、找房子、找对象,儋州综合生活信息门户! | 防水套管_柔性防水套管_刚性防水套管-巩义市润达管道设备制造有限公司 | 新能源汽车电机定转子合装机 - 电机维修设备 - 睿望达 | 定做大型恒温循环水浴槽-工业用不锈钢恒温水箱-大容量低温恒温水槽-常州精达仪器 | 登车桥动力单元-非标液压泵站-非标液压系统-深圳市三好科技有限公司 |