SpringCloud Gateway获取post请求体(request body)
发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,获取spring cloud gateway POST请求体的时候,会有很多坑,网上大多数解决方案是/**这种方法在spring-boot-starter-parent 2.0.6.RELEASE +
千家信息网最后更新 2025年12月01日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安全错误
数据库的锁怎样保障安全
软件开发工程师年终评价
软件开发应用什么软件
思远网络技术有限公
公司网络安全管理管理员职责
数据库的基本对象
企业服务器如何挑选
怎么卸载服务器
趣链科技互联网
网络技术的逻辑功能
网络安全产品广告语
ns关联账号与服务器断开连接
软件开发的实际基本流程
信阳网络安全攻防对抗技术挑战赛
全球网络安全龙头公司市值
护苗网络安全手抄报怎么画
怎样读取动态心电图的数据库
用友软件数据库说明书
魔兽从服务器断开什么原因
http图片服务器
开发软件软件开发
政策型数据库
建立国家反洗钱数据库
如何投诉软件开发商欺骗
网络安全黑板报2020初中
小 FTP服务器
天津java软件开发培训
制造企业库存管理软件开发
思维软件开发厦门
数据库安全csdn
上海鲲鹏服务器厂家供应