SpringCloud Gateway获取post请求体(request body)
发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,获取spring cloud gateway POST请求体的时候,会有很多坑,网上大多数解决方案是/**这种方法在spring-boot-starter-parent 2.0.6.RELEASE +
千家信息网最后更新 2025年01月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安全错误
数据库的锁怎样保障安全
广州智享互联网科技有限公司
青少年网络安全绘画作品
联通杯网络安全知识竞赛题库
汽车网络安全能承载多少数据
戴尔服务器硬盘驱动
网络安全工程师pte
海康平台服务器配置wbe端口号
营口二手服务器回收
乡开展网络安全宣传周活动
服务器端代理
信息通信网络安全员
江西公安网络安全测评公司
网页查询数据库数据导出
邳州扫码洗车软件开发
利用数据库进行数据分析
网络安全要不要公私分明
方舟服务器加载特别慢
怎么打开web服务器
vs连接数据库方式
义乌软件开发自学步骤
如何评估服务器能运行几台虚拟机
数据库使用向导创建表
库存网络技术检查
数据库原理及设计叶斌
服务器如何查询所使用的通信协议
监利县网络安全宣传
我的世界材质包如何装进服务器
聊城节能软件开发团队
软件开发螺旋模型工作过程
城信服务器