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

文章讲述了在使用SpringWebFlux和Flink进行服务埋点时遇到的JSON解析问题,发现是由于Windows和MacOS下微信小程序的请求体中多出双引号,经分析怀疑是HttpMessageConverter处理不当造成的。作者尝试了抓包工具ProxyPin来确认问题源头。
摘要由CSDN通过智能技术生成

缘起

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

多出的双引号

查看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里面对应的方法下了一个断点。

@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中查找抓到的包,查看请求体,清楚的看到请求时前后都有引号
    在这里插入图片描述
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值