SpringCloudGateway获取body中的参数,最优雅的方式

这篇具有很好参考价值的文章主要介绍了SpringCloudGateway获取body中的参数,最优雅的方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

        项目需要在Gateway中获取请求参数,原生提供了request.getQueryParams()方法获取请求参数,但是只能获得url上的param,对于form body中的参数获取不到。找了很多方法,网上普遍都是通过自定义Filter缓存Body中的内容,然后再获取缓存的Body,此处的缓存实现方法各异,有些还存在内存泄漏问题。本文使用官方自带的缓存过滤器实现,然后整合url参数和body参数到同一对象进行查询。

配置官方过滤器

        在yml配置文件中设置CacheRequestBodyGatewayFilterFactory过滤器到请求链路上,此过滤器或帮我们缓存请求中的body,避免后文获取不到body。需要注意的是yml中的name对应的是CacheRequestBody,还需要提供一个bodyClass参数,具体配置看代码。

spring:
  cloud:
    gateway:
      routes:
        #user 模块
        - id: user-system
          uri: lb://user-system
          predicates:
            - Path=/user/**
          filters:
            - name: CacheRequestBody
              args:
                bodyClass: java.lang.String
            # token认证
            - TokenFilter

获取参数

        上文配置缓存后,我们就可以在自定义过滤器中获取body内容了,此处获取到的是String类型的数据,类似:name=123456&sex=1。我们使用自定义方法将body字符串进行解析,然后将原有的queryParams合并到一起方便后文查询。文章来源地址https://www.toymoban.com/news/detail-609683.html

public class TokenFilter extends AbstractGatewayFilterFactory {

	@Override
	public GatewayFilter apply(Object config) {
		return (exchange, chain) -> {
			ServerHttpRequest request = exchange.getRequest();
			//获取body内容,必须在yml中配置CacheRequestBody,让系统缓存body,不然此处无法获取
			String cachedRequestBody = exchange.getAttribute(ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR);
			MultiValueMap<String, String> queryParams = formatUrlParam(cachedRequestBody, request.getQueryParams());
			// 获取参数
			String grantType = queryParams.getFirst("grant_type");
			// TODO 业务逻辑
			return chain.filter(exchange.mutate().request(request).build());
		};
	}

	/**
	 * 将body中的字符串格式化并合并url中的参数
	 * @param cachedRequestBody body字符串
	 * @return map
	 */
	private MultiValueMap<String, String> formatUrlParam(String cachedRequestBody, MultiValueMap<String, String> queryParams){
		if(cachedRequestBody == null || "".equals(cachedRequestBody.trim())){
			return queryParams;
		}
		//定义返回对象
		Map<String, List<String>> mapParam = new HashMap<>();
		//拷贝url中的参数
		queryParams.forEach(mapParam::put);
		//解析body中的参数
		String[] splitURL=cachedRequestBody.split("&");
		for(String s:splitURL){
			if(s.indexOf("=") > 0){
				s = s.replace("&", "");
				int index = s.indexOf("=");
				String key = s.substring(0, index);
				String value = s.substring(index+1);
				//适配系统逻辑
				List<String> list = mapParam.computeIfAbsent(key, k -> new ArrayList<>());
				list.add(value);
			}
		}
		return new MultiValueMapAdapter<>(mapParam);
	}
}

总结

  1. 配置yml中的CacheRequestBody
  2. 自定义过滤器中获取:
    exchange.getAttribute(ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR)

到了这里,关于SpringCloudGateway获取body中的参数,最优雅的方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何在Spring Boot中优雅地进行参数校验

    在平时的开发工作中,我们通常需要对接口进行参数格式验证。当参数个数较少(个数小于3)时,可以使用 if ... else ... 手动进行参数验证。当参数个数大于3个时,使用 if ... else ... 进行参数验证就会让代码显得臃肿,这个时候推荐使用注解来进行参数验证。 在Java中,注解

    2024年01月17日
    浏览(43)
  • Spring/SpringBoot 过滤器修改、获取http 请求request中的参数 和 response返回值,比如修改请求体和响应体的字符编码

    通过自定义filter,RequestWrapper,ResponseWrapper 处理请求和响应数据,比如修改请求体和响应体的字符编码 1.request 和 response 中的数据都是 存在流中的(缓存中)获取一次就没有了,需要重新写回去。所以需要两个包装类分别继承HttpServletRequestWrapper 和 HttpServletResponseWrapper 对 r

    2024年02月15日
    浏览(39)
  • 【Java】SpringCloud Gateway自定义过滤器中获取ServerHttpRequest的body中的数据为NULL的问题

    这个情况出现在,我需要进行验证码的校验,因此用户的请求首先需要被验证码过滤器校验,而验证码过滤器不需要设定为全局过滤器,因此我就单纯的把它设定为了一个局部过滤器,代码如下 然后我进行请求的时候,json参数如下 然后请求经过解析后会发现,字符串居然是

    2024年02月09日
    浏览(51)
  • Springboot实现优雅的参数校验(Spring Validation)和 if else说再见

    当我们想提供可靠的 API 接口,对参数的校验,以保证最终数据入库的正确性,是 必不可少 的活。比如下图就是 我们一个项目里 新增一个菜单校验 参数的函数,写了一大堆的 if else 进行校验,非常的不优雅,比起枯燥的CRUD来说,参数校验更是枯燥。这只是一个创建菜单的

    2023年04月15日
    浏览(39)
  • SpringBoot基于Aop优雅的处理参数中的空格(提供Gitee源码)

    前言:在实际开发中,很多用户会不经意的输入空格,导致存入数据库中的信息也同样存在空格,这样会导致根据某个字段去查询数据的时候总是查询不到的问题,后来才发现是因为多了个空格的问题,如果我们按传统的方式在每个方法中一个个对空格进行处理,这样会导致

    2024年02月20日
    浏览(29)
  • SpringCloudGateway过滤器(全局认证、IP拦截、请求参数过滤、响应参数过滤)

    全局过滤器(认证) IP网关过滤器 请求参数网关过滤器

    2024年02月14日
    浏览(40)
  • springMVC获取请求参数的方式

    将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装当前请求的请求报文 只需要在控制器方法的形参位置,设置一个形参,形参的名字和请求参数的名字一致即可 后端根据前端页面传入的实际参数进行一一取值(参数的少的情况下建议使用) @Re

    2024年02月02日
    浏览(51)
  • 【flink】flink获取-D参数方式

    参考官网 使用Flink官方的ParameterTool或者其他工具都可以。 (1)ParameterTool 获取参数 以 -D 开头的参数: (2)Env获取参数 举个例子使用以下方式启动flink job。 可通过以下代码获取:state.savepoints.dir 参数 需要说明:使用 StreamExecutionEnvironment 和 StreamTableEnvironment 都无法获取参数

    2024年02月06日
    浏览(46)
  • 【SpringMVC]获取参数的六种方式

    目录 1.通过ServletAPI获取 2.通过控制器方法的形参获取 3.@RequestParam:将请求参数和控制器方法的形参绑定 4.@RequestHeader:将请求头信息与控制器方法的形参的值进行绑定 5. CookieValue:将cookie数据和控制器方法的形参绑定 Cookie: ​编辑 6.通过控制器方法的实体类类型的形参获取

    2024年02月09日
    浏览(49)
  • Javaweb——Request通用方式获取请求参数

    在旧的请求参数的获取方式当中,需要对两种不同的请求方式做两份不同的代码逻辑,现在就是要统一操作,比如在post里面调用get的代码   如下图的操作 先获取请求方式,对于不同的方式都先把请求参数获取出来,这里request还完成了对字符串的解析,对和=进行切割 之后将

    2024年02月13日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包