SpringWebFlux RequestBody多出双引号问题——ProxyPin抓包揪出真凶

ops/2025/1/16 2:47:17/

缘起

公司有个服务做埋点收集的,可以参考我之前的文章埋点日志最终解决方案,今天突然发现有些数据日志可以输出,但是没法入库。

多出的双引号

查看Flink日志发现了JSON解析失败,Flink是从Kafka拿数据,Kafka本身不处理数据,Kafka前面是埋点收集服务,这个服务是SpringWebFlux+ReactorKafka做的,收集到数据后对数据做一些解码或解密(如UrlDecode,Base64Decode或者Aes解密等),写入日志并且扔进Kafka。查看日志发现类似以下内容:

# 省略了大部分字段,只为说明问题
"{"client":"xcx","os":"windows","ip":"192.168.1.1","xx":"xxxx"}"
"{"client":"xcx","os":"Macos","ip":"192.168.1.1","xx":"xxxx"}"

明显看出前后各多了一个双引号。

场景复现

仔细比对了大量日志,发现只有MacOS和Windows下的微信打开小程序时会出现这个问题,安卓,iOS系统的微信小程序不会出现这个问题,分别使用了一台MacOS和Windows,成功复现

SpringWebFlux的HttpMessageConverter捣的鬼???

顺着日志输出的往上找,有一个UrlDeocde操作,仔细测试了下这个UrlDeocde步骤,发现不会自动产生双引号。我第一个想到的就是SpringMVC如果HttpMessageConverter使用不当就导致这个问题,尤其是想使用FastJson序列化JSON但没处理Jackson,这俩同时存在的时候,会多出双引号。于是我在Controller里面对应的方法下了一个断点。

java">@PostMapping(value = "/receive/xcx")
public Mono<ResultBase<String>> receiveXcx(@RequestBody Mono<String> body) {return xcxKafkaSink.sendRecord(body).map(ResultBase::of); //这一行下断点
}

从这个点开始回溯发现SpringWebFluxSpringMVC差距太大,这个Reactor风格的异步调用链,真是看不出中间干了啥,更别提找到HttpMessageConverter在哪执行的,后来找到了HttpMessageConverter的实现类,在对应的方法read()中都下了断点,根本没走到断点。
在这里插入图片描述
我在xcxKafkaSink.sendRecord(body)加了一行输出日志打印了一下body,发现当前端传入双引号时会这里会出现双引号,当前端不传入双引号时,这里就没有双引号,证明了问题大概率出在请求方。
后来和架构聊了下发现以上存在2个问题:

  1. SpringWebFlux是异步的,在Controller的方法下断点根本没用,因为RequestBody走到Controller这里还没使用,数据还在Buffer中,根本没有读取,就不会走HttpMessageConverter,所以在HttpMessageConverter的实现类中下断点根本走不到,需要经过数据使用的那里理论上才会走HttpMessageConverter链。(我后来有去找过在哪调用HttpMessageConverter,没找到所谓的HttpMessageConverter链,可能需要好好了解SpringWebFlux原理才能知道在哪吧)
  2. 只有Windows和MacOS下微信小程序会有这个问题,安卓和iOS下都没有,说明大概率不是后端的问题。

抓包显露真凶

如果服务端没法看出来啥问题,那就直接从客户端入手,试试能不能看到客户端请求时body体里面带了双引号。
从网上找了找资料,发现国产的ProxyPin比较好用,于是下载使用。
地址:https://github.com/wanghongenpin/network_proxy_flutter/releases
我的电脑是M2芯片的MacOS,下载对应的包即可。

  1. 打开提示包损坏,去设置->隐私里点仍要打开即可
  2. 打开后点击最上方的锁标志,打开启用HTTPS代理,然后点安装根证书到本机,按提示安转并信任根证书。
  3. 打开微信小程序,触发问题
  4. ProxyPin中查找抓到的包,查看请求体,清楚的看到请求时前后都有引号
    在这里插入图片描述

http://www.ppmy.cn/ops/25585.html

相关文章

场景文本检测识别学习 day06(Vi-Transformer论文精读)

Vi-Transformer论文精读 在NLP领域&#xff0c;基于注意力的Transformer模型使用的非常广泛&#xff0c;但是在计算机视觉领域&#xff0c;注意力更多是和CNN一起使用&#xff0c;或者是单纯将CNN的卷积替换成注意力&#xff0c;但是整体的CNN 架构没有发生改变VIT说明&#x…

Qt相关开源项目总结

Qt官方github&#xff1a; https://github.com/orgs/qt/repositories 参考 https://blog.csdn.net/pzs0221/article/details/131337353

前端科举八股文-HTML篇

前端面试-HTML篇 什么是http?http和https有什么区别https的加密过程?http2.0有什么改进?src和href的区别对html语义化标签的理解?script标签中defer和asyc的区别?举出几个常见的行内、块级元素什么是webworker&#xff1f;iframe的优缺点&#xff1f;介绍一下tcp三次握手f…

图论单源最短路径——spfa

【模板】单源最短路径&#xff08;弱化版&#xff09; 本题用的spfa 题目背景 本题测试数据为随机数据&#xff0c;在考试中可能会出现构造数据让SPFA不通过&#xff0c;如有需要请移步 P4779。 题目描述 如题&#xff0c;给出一个有向图&#xff0c;请输出从某一点出发到…

sym和syms--Matlab学习

一、sym sym是 MATLAB 中的一个函数&#xff0c;用于创建符号对象。 符号对象允许你在 MATLAB 中进行符号计算和代数运算&#xff0c;而不仅仅是数值计算。使用符号对象&#xff0c;你可以表示符号表达式&#xff0c;求解方程&#xff0c;进行符号积分等。 例如&#xff0c;你…

【MySQL】表的约束

【MySQL】表的约束 文章目录 【MySQL】表的约束前言正文空属性默认值列描述zerofill主键自增长唯一键外键 前言 ​ 对于表来说&#xff0c;真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;我们需要有一些额外的约束&#xff0c;更好的保证数据的合法…

2012NOIP普及组真题 2. 寻宝

线上OJ&#xff1a; 一本通&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1958 核心思想&#xff1a;&#xff08;模拟&#xff09; 1、模拟 每一层从起始房间开始&#xff0c;轮询 x 个有楼梯的房间后到达终点房间 2、由于 0 < N ≤ 10000 &#xff0c; 0…

VS2019编译OSG3.7.0+OSGEarth3.3+OSGQt5.15.2时遇到的问题及解决方法

注:本次编译以文章《VS2019编译OSG3.7.0+OSGEarth3.3+OSGQt》为基础搜集资料并进行编译 一 OSG编译 1.Osg3.7.0编译中,cmake阶段按照文章步骤即可。 2.另外,还需要对以下三项进行设置,参照《OSG-OpenSceneGraph在WIN10与VS2022下的部署(OSG3.6.5+VS2022+Win10_x64)个…