springcloud gateway 获取post请求体Json分段导致不全的解决方案
发布日期:2021-09-18 00:51:45
浏览次数:8
分类:技术文章
本文共 2686 字,大约阅读时间需要 8 分钟。
springcloud gateway 获取post请求体Json分段导致不全的解决方案
开发版本 springboot 2.0.8.RELEASE + springcloud Finchley.SR2 + spring cloud gateway前端客户端采用post发送请求,content_type: application/json,
spring cloud gateway需要从request的中取出body进行网关的鉴权处理,然后把处理之后的数据重新封装到body中转发给下游业务系统, 最之前的方式采用的是以下方式读取请求体: AtomicReference<String> bodyRef = new AtomicReference<>();//缓存读取的request body信息 Flux<DataBuffer> fluxBody = exchange.getRequest().getBody(); fluxBody.subscribe(buffer -> { CharBuffer charBuffer = StandardCharsets.UTF_8.decode(buffer.asByteBuffer()); DataBufferUtils.release(buffer); bodyRef.set(charBuffer.toString()); }); String bodyStr = bodyRef.get(); 偶尔前端提出验签失败,检查上送请求体报文时发现错误:网关获取的body不完整。尝试了网上的写法来获取body,于是改成了以下的写法来亲自验证,偶尔还是发现网关获取的body体不完整,说明此方法还是不行,有坑。
private String resolveBodyFromRequest(ServerHttpRequest serverHttpRequest){
//获取请求体 Flux<DataBuffer> body = serverHttpRequest.getBody(); StringBuilder sb = new StringBuilder(); body.subscribe(buffer -> { List<String> list = Lists.newArrayList(); byte[] bytes = new byte[buffer.readableByteCount()]; buffer.read(bytes); DataBufferUtils.release(buffer); String bodyString = new String(bytes, StandardCharsets.UTF_8); sb.append(bodyString); }); return sb.toString(); } 继续查询相关资料,有几篇文件介绍了要解决获取body不完整的情况得代用code路由的方式来配置,而不能采用yml,于是继续尝试。 @Bean public RouteLocator tpauditRoutes(RouteLocatorBuilder builder) { return builder.routes() .route(r ->r .readBody(String.class, requestBody -> { //log.info("requestBody is {}", requestBody); // 这里 r.readBody做了一个前置语言,这样就可以在filter中通过exchange.getAttribute("cachedRequestBodyObject"); 获取body体 return true; }).and() .path("/gw/xxxdmin/**") .filters(f -> f.stripPrefix(1) .hystrix(h -> h.setName("Hystrix").setFallbackUri("forward:/timeoutfallback"))) .uri("lb://ADMIN/") ) .route(r ->r .readBody(String.class, requestBody -> { //log.info("requestBody is {}", requestBody); // 这里 r.readBody做了一个前置语言,这样就可以在filter中通过exchange.getAttribute("cachedRequestBodyObject"); 获取body体 return true; }).and() .path("/gw/xxxapp/**") .filters(f -> f.stripPrefix(1) .hystrix(h -> h.setName("Hystrix").setFallbackUri("forward:/timeoutfallback"))) .uri("lb://APP/") ).build();
}然后移除yml中配置的路由:
routes: - id: xxxAPP uri: lb://xxxAPP predicates: - Path=${server.servlet.context-path}/xxxapp/** filters: - StripPrefix=1 - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 1 #允许用户每秒处理多少个请求 redis-rate-limiter.burstCapacity: 1 #令牌桶的容量,允许在一秒钟内完成的最大请求数 key-resolver: "#{@addressKeyResolver}" #使用SpEL按名称引用bean # 降级配置 - name: Hystrix args: name: default fallbackUri: forward:/timeoutfallback业务处理过滤器中通过String bodyStr = exchange.getAttribute("cachedRequestBodyObject");方法获取请求体,
最终问题得以解决。但本人喜欢采用yml配置文件的形式来做路由,所以对于yml路由的配置,此坑还需要进一步的排查解决。
转载地址:https://blog.csdn.net/yucaifu1989/article/details/105121886 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
感谢大佬
[***.8.128.20]2024年04月02日 17时47分22秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
为什么要急着为「木兰」编程语言贴上“造假”的标签?
2019-04-26
编程语言国产化的关键一战——对肆意污名化“木兰”编程语言说“不”
2019-04-26
各大媒体对「木兰」编程语言的不当言论盘点
2019-04-26
戳破针对「木兰」编程语言的拙劣谣言
2019-04-26
为「木兰」编程语言添加对中文命名标识符的支持
2019-04-26
悬赏万元,重现「木兰」编程语言编译器
2019-04-26
跳出编程语言本身看中文编程语言设计
2019-04-26
RPLY 入门例程中文化
2019-04-26
木兰编程语言入门教程之一——浅介
2019-04-26
木兰编程语言入门教程之二——控制走向
2019-04-26
基于「木兰」编译器,加十行代码实现 ∈ (属于集合)语法
2019-04-26
创建安卓键盘演示——“好不”
2019-04-26
木兰编程语言入门教程之三——函数和类型
2019-04-26
基于「木兰」逆向工程用 pyinstaller 生成可执行文件
2019-04-26
从微盟事件看商业数据公开化的必然趋势
2019-04-26
为新语言编写Visual Studio Code语法高亮插件
2019-04-26
手机编程环境初尝试-用AIDE开发Android应用
2019-04-26
Java关键字的汉化用词探讨
2019-04-26
程序员面试时用中文命名写白板代码的好处
2019-04-26
1992年日本对母语编程的可读性比较实验
2019-04-26