SpringCloud Gateway获取post请求体(request body)
发表于:2024-12-12 作者:千家信息网编辑
千家信息网最后更新 2024年12月12日,获取spring cloud gateway POST请求体的时候,会有很多坑,网上大多数解决方案是/**这种方法在spring-boot-starter-parent 2.0.6.RELEASE +
千家信息网最后更新 2024年12月12日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安全错误
数据库的锁怎样保障安全
保证网站服务器的安全性
东软软件开发工程师工资
怎样使用数据库的语言
机房网络安全维护方案
网络安全技改方案
网络安全第59条罚款是多少
软件开发接口谁设计
宁南县软云软件开发有限公司
燃料智能化系统软件开发难点
数据库恢复备份软件
服务器建立新硬盘
山东布尔网络技术有限公司
数据库 复制列
存储服务器总容量
qq邮件打开显示服务器错误
公安信息网络安全题库
英雄联盟国际服服务器正在维修
查看网络安全服务价格
数据库设计的特点和不足
网络安全带给我们的启示
大家称赞的耐盐碱植物数据库
服务器上门维修
byte 数据库类型
go 数据库单测
网络安全防范体系的重要性
阿里 数据库 规范
中国网络安全走势
中国最大的数据库公司
网络安全人民手抄报怎么做啊
幼儿园网络安全宣传画图片