SpringCloud Gateway获取post请求体(request body)
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,获取spring cloud gateway POST请求体的时候,会有很多坑,网上大多数解决方案是/**这种方法在spring-boot-starter-parent 2.0.6.RELEASE +
千家信息网最后更新 2026年10月31日SpringCloud Gateway获取post请求体(request body)
获取spring cloud gateway POST请求体的时候,会有很多坑,网上大多数解决方案是
/**这种方法在spring-boot-starter-parent 2.0.6.RELEASE + Spring Cloud Finchley.SR2 body 中生效, 但是在spring-boot-starter-parent 2.1.0.RELEASE + Spring Cloud Greenwich.M3 body 中不生效,总是为空*/private String resolveBodyFromRequest(ServerHttpRequest serverHttpRequest) { Flux body = serverHttpRequest.getBody(); AtomicReference bodyRef = new AtomicReference<>(); body.subscribe(buffer -> { CharBuffer charBuffer = StandardCharsets.UTF_8.decode(buffer.asByteBuffer()); DataBufferUtils.release(buffer); bodyRef.set(charBuffer.toString()); }); return bodyRef.get(); } 但是实际这种解决方案(例如 这篇文章)会带来很多问题,比如request不能在其他filter中获取,会报错:
reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.IllegalStateException: Only one connection receive subscriber allowed.Caused by: java.lang.IllegalStateException: Only one connection receive subscriber allowed.针对这种不能重复获取的问题,网上通用解决是把request重新包装,继续传递,比如 这篇文章的解决方案。
但是这种方案还会带来request body获取不完整,只能获取1024B的数据,这个问题暂时没有很好的解法,很头痛,在给官方提issues的时候,issues709 和issues707 的时候,对方让我参看一个类ModifyRequestBodyGatewayFilterFactory.java,说真的并没有看懂,最后翻源码的时候,发现了一个预言类,ReadBodyPredicateFactory ,发现里面缓存了request body的信息,于是在自定义router中配置了ReadBodyPredicateFactory,然后在filter中通过cachedRequestBodyObject缓存字段获取request body信息,这种解决,一不会带来重复读取问题,二不会带来requestbody取不全问题。三在低版本的Spring Cloud Finchley.SR2也可以运行。
step 1:现在自动以router里面配置ReadBodyPredicate预言类:RouteLocatorBuilder.Builder serviceProvider = builder. routes().route("gateway-sample", r -> r.readBody(Object.class, requestBody -> { log.info("requestBody is {}", requestBody); // 这里不对body做判断处理 return true; }).and().path("/service"). filters(f -> { f.filter(requestFilter); return f; }) .uri("http://127.0.0.1:8009")); RouteLocator routeLocator = serviceProvider.build();step2:在自定义filter中获取缓存了的request body: Object requestBody = exchange.getAttribute("cachedRequestBodyObject");至此问题解决,完整代码在我的github上面。参考这里。
参考:
https://www.cnblogs.com/cafebabe-yun/p/9328554.html
https://blog.csdn.net/tianyaleixiaowu/article/details/83375246
问题
方案
时候
缓存
解决方案
信息
是在
篇文章
预言
参考
配置
不对
头痛
说真的
代码
字段
官方
实际
对方
数据
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网黑科技
互联网科技公司起名
科技互联网产品
科技互联网项目
互联网科技资迅
互联网科技的
互联网科技小贷
银优互联网科技有限公司
上海卓越科技 互联网
美国互联网前沿科技
互联网科技生活的内容
西藏七维空间互联网科技有限公司
昭通云南众福互联网科技有限公司
湖北码尼互联网科技有限公司电话
彤创互联网科技有限公司
内蒙古九一互联网科技
沐思想互联网科技有限公司
从那以后互联网科技有限公司
银川新华互联网科技学校招聘
山东亿川互联网科技有限责任公司
云之行互联网科技
互联网 卓越科技
杭州互联网科技公司
互联网巨头投资的硬核科技
华中科技有哪些互联网大佬
互联网科技扶贫时间
互联网新科技动漫ppt素材
河南住房之家互联网科技
高科技互联网发展前景如何
从那以后互联网科技有限公司