一、需求

在使用spring gateway作为网关时,我们需要在经过网关的请求中添加一些需要传递给后续服务的公共参数,这个时候就可以用到spring gateway提供的自定义请求参数功能了。

二、寻找解决途径

1、参考官方文档

我们可以猜测,spring gateway作为网关功能,肯定会提供很多处理请求参数的功能,于是我们查询文档得到如下内容:

2、探索GatewayFilterFactory实现规律

通过查询spring官方文档可以看到,spring gateway为我们提供了很多xxxGatewayFilterFactory,而这些factory都有相同点,都是以GatewayFilterFactory结尾的。

在类名中,我们可以根据类名进行大胆的猜测,前面的几个单词是描述他的功能的。

右侧的yml配置文件可以看到,filter的配置也是呈现出一定的规律的。

3、从源码获取实现原理

既然我们是要解决自定义请求参数封装问题,那么我们通过上面描述规律,可以很大胆的猜测AddRequestParameteGatewayFilterFactory就是我们要找的目标。那么我们查看一下他的源码,看看他是如何实现的。

首先看看AddRequestParameteGatewayFilterFactory的继承关系,大概了解一下他的组成

从继承关系来看,还是比较复杂,有点懵逼,那直接进入代码看看他的实现。

我们只粘贴比较核心的代码进行分析,其他代码暂时不用关心。

@Override

public GatewayFilter apply(NameValueConfig config) {

return new GatewayFilter() {

@Override

public Mono 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是如何使用的了。

从图中可以看到,我们的filter就是在这个配置文件中配置使用的。那为什么配置文件中只有AddRequestParameter配置,而不是AddRequestParameterGatewayFilterFactory呢???

其实这是spring的一种约定,实现了GatewayFilterFactory接口的类在配置使用的时候,需要省略掉后面的GatewayFilterFactory,仅配置前缀即可。

同时,配置文件中的red,blue又是做什么的???

这就是我们需要传递的请求参数了,他以key=red,value=blue的方式进行配置。

然后spring会帮我们把这个键值传入到上面的apply方法的config中。我们通过config的源码就能看到究竟:

可以看到,config类的实现就是一个name 和value,分别对应了配置文件中的两个参数。

三、基于官方实现进行自定义拓展

我们看到,spring利用同种方式,实现了各种filter。但如果这些都不能满足我们的要求,那该怎么办???

1、自定义参数惨景预设

我们现在看到的参数信息都是写死在配置文件中的,无法进行动态参数的传递。我们可以设想一个很普通的场景: 我们需要把用户的登录信息封装到请求参数中,供其他服务使用。那这又该如何实现呢???

2、参考官方实现进行自定义

其实如果我们只要模仿官方实现,在uri上拼接我们要传递的动态参数就可以了。具体实现如下:

@Override

public Mono 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 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管理。

至此,我们自定义请求参数封装完成!!!

到此这篇关于Spring Gateway自定义请求参数封装的实现示例的文章就介绍到这了,更多相关Spring Gateway自定义请求参数封装内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

java封装入参_Spring Gateway自定义请求参数封装的实现示例相关推荐

  1. Java校验入参之正则表达式校验特殊字符

    Java校验入参之正则表达式校验特殊字符 前言 实现流程 总结 参考链接 前言 场景描述 第三方调用接口时,有些特殊字符不允许传参,可能影响存储.或者加解密等问题,下面以斜杠"/" ...

  2. SpringBoot自定义请求参数转换器

    需求 我们可能对接客户的系统的时候,虽然Spring为我们提供的很多方便的转换器,但是遇到还是可能遇到需要自定义请求参数转换器的情况. 日期转换器 SpringBoot默认是没有配置日期转换器的我们可 ...

  3. spring页面使用注解@RequestParam把请求参数封装到map中

    spring页面请求参数封装到map中 1.使用注解@RequestParam : /*** 查询全部[对应企业的全部]* @return*/@RequestMapping(value="/ ...

  4. aop 获取方法入参出参_Spring AOP获取请求URL的入参及返回值(通用方法)

    以下代码为通用的代码,其中json解析使用的是fastJson,可以记录用户访问的ip.url.入参和出参 /** * @author jasonLu * @date 2017/10/26 9:57 ...

  5. Java接口入参和出参规范建议

    把最近项目中遇到的问题跟大家分享下:最近做了一个项目,后端接口写好后和pc端vue联调完毕,业务还需要和App端[ios,andro]对接,问题来了,后端接口中的入参和出参都是Java数据类型[Dat ...

  6. Java泛型入参的三种通配符使用

    Java泛型中有三种通配符 1.<? extends xxx>子类界定 2.<? super xxx>超类界定 3.<?>无限定 1.<? extends x ...

  7. java校验入参的有效性的工具类

    闲来无事的时候,对之前项目中写过的代码做个简单的总结,其中有一个用于校验入参是否有效的工具类,在此记录一下,以便后续查询使用,现贴出以下代码, public void validateRequestP ...

  8. java爬虫---问卷星自动提交问卷请求参数(jqsign,jqnonce等)解密

    以https://www.wjx.cn/jq/35713991.aspx这个问卷页为例 填完问卷打开控制台,转到network并且勾选preserver log(不然等会儿提交的请求看不到),点提交, ...

  9. http get请求参数封装成map

    http get请求参数工具类: public class UrlSpiltUtils {/*** 小程序拼接* @param url* @return*/public static String u ...

最新文章

  1. qstring 属于元数据类型吗_数据仓库的“元数据管理”
  2. .NET 判断进程是否运行 是否未响应
  3. (20):数据的准备工作
  4. java html api 百度云,Javase-6.0_中文API_HTML(最新更新)
  5. 【Vegas原创】远程桌面下重启xp系统的命令
  6. mysql 客户端乱码_mysql客户端中文乱码
  7. c++ qt5范例开发大全_237页建设工程监理内业资料全套范例,附百份案例表格,快拿走...
  8. 什么是Joint Escalation Team?
  9. php soap 用法,php soap用法
  10. js实现数字金额转换大写及数字加千分符
  11. 康托尔连续统假设(CH)不成立
  12. MFI认证——什么是苹果MFI认证
  13. 极狐公司官方澄清声明
  14. 自动添加控件,一次提交多条记录。
  15. Mac 使用brew安装phpredis扩展
  16. mysql 悲观锁实现
  17. js 监听浏览器窗口大小变化
  18. electron自动更新版本electron-updater
  19. java httpget 传参数_Java 发送http请求(get、post)
  20. 西电计算机绘图试题及答案,【图】- 西安电子科技大学2021春 计算机绘图(大作业)答 - 苏州常熟常熟周边其他教育培训 - 苏州百姓网...

热门文章

  1. Android渠道包测试方案
  2. html转图片 workflow,用 Workflow + Day one 给未来的自己做时间履历 | Matrix 精选
  3. 使用 Arduino IDE 对 STM32进行程序开发,安装开发板
  4. 澳门大学计算机语言博士生导师王珊,四年资助百余万!澳门大学人文学院招收博士生(第二批)...
  5. python树结构输出到excel_【IT专家】使用Excel电子表格表示树层次结构,以便Python CSV reader轻松解析?...
  6. html5 自动扣图,js+html5 canvas实现ps钢笔抠图
  7. (1)D触发器VHDL描述
  8. Kernel Data Structures [LKD 06]
  9. C++课设-学生信息管理系统
  10. 财路网每日原创推送:区块链金融产业前景广阔