一、问题概述

说下程序的架构。

有个后台管理系统A,在页面修改数据后,会用httpClient发http请求给系统B;

系统B做了异步机制,收到A发的请求后,将数据封装为Mq消息发给RabbitMq,然后结束该请求;

然后系统B自己也是消费者,去对应的Rabbitmq拉取消息后,封装一个httpClient通知系统C。

系统C会将该数据放到Redis里面。

然后我们发现,Redis里面的value出现了中文乱码问题。

大概的流程如下:

我采取的办法是,因为我们的所有系统,都默认是要采用“utf-8”来编码,那么我只要一路跟踪请求的链路,看看到底是在哪一步乱码的,就知道问题所在了。

我准备利用wireshark和rawcap来跟踪链路。本来不需要RawCap,主要是wireshark无法跟踪localhost链路上的网络请求。(上图,系统A、B、Mq在同一台机器上)

二、链路跟踪

2.1 A到B的链路跟踪

上面提到,A是后台管理系统。下面是其界面。

注意到,上图中,有一个“中”字。而“中”在utf8中被编码为:

这边先不讲,怎么利用wireshark和rawcap来抓包。先看我们跟踪的结果:

经过寻找,我们页面上提交的“11中11236ckl111”就在上图红框标出的地方。

这有个小技巧,我提交的字符串中,“中”字前后有两个1,主要就是方便寻找。

上图,红框前后各有两个31,(对应数字1),那中间的“e4 b8 ad”就是中字的编码。

可以看到,这个编码没问题,因为和我们查到的“中”的utf8编码是一致的。

2.2 B到Mq的链路跟踪

注意上图,就是系统B发到Mq的消息(上图中红框标识了其协议为AMQP,后面的Basic Publish表示这是一条生产者发送的消息)。

这里的编码也是没问题的。

2.3 系统B消费Mq的消息的链路跟踪

和上一节类似,该消息就是系统B作为消费者从Mq拉到的。

这里的编码也没问题。

2.4 系统B消费消息后,发送给系统C的消息的链路跟踪

注意了,上图这里,我们发现,这次“中”所在的编码,不再是utf-8,而是变成了什么“e6 b6 93 ef bf bd”之类的内容。

我猜想了半天,实在难以理解为什么编码会变成这样。哪怕utf32也不会用6字节来编码这么一个简单的汉子吧。

出问题的节点是找到了,那么剩下的就是查看代码。

2.5 代码问题定位

上图,第一个红框的位置,是获取消息体的字节数组;

第二个位置,就是将字节数组解码为String。

我猜测就是第二步出了问题。

让我们看看该方法的说明:

这里是说,将会按照系统的默认字符集来解码。

我在192.168.19.88上写了个java测试类,打印了下列变量:

String csn = Charset.defaultCharset().name();

而结果显示出来就是:

所以,问题很明显,就是因为本来是utf8的字节,用gbk来解码,当然会乱码。

2.6 解决办法1

参考了:

https://blog.csdn.net/qq_21033663/article/details/53022797

1、通过System.out.println(System.getProperty("file.encoding"));可查看JVM运行时所使用的编码

2、默认情况:

1)Windows下,file.encoding=”GBK”, 
2)Linux下,file.encoding=”UTF-8”。

3、通过修改Tomcat配置来指定JVM运行时所使用的编码

1)linux下,在catalina.sh配置:JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=utf-8"

2)Windows下:在catalina.bat配置:set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8

2.7 解决办法2

new String的时候,指定正确的解码字符集就可以了。

如下:

三、参考资料

1、RawCap的使用

https://blog.csdn.net/lz_obj/article/details/53116432

这个可以多开,同时跟踪多个网卡。

这里注意的一点是:

比如两个服务部署在同一个服务器上,但是调用的时候,host用的是真实ip(192.168.19.88)而不是127.0.0.1的话,

抓包的时候,可以像下面这样:

RawCap.exe 192.168.19.88 dumpfile.pcap

2、wireshark的使用

https://www.cnblogs.com/yuhuameng/p/5871443.html

3、utf-8编码转换

http://www.mytju.com/classcode/tools/encode_utf8.asp

												

wireshark和RawCap跟踪并解决中文乱码问题的更多相关文章

  1. 增加UBUNTU字符集 解决中文乱码问题

    对GBK,GB2312,GB18030字符集的支持是UBUNTU中文乱码的罪魁祸首,其实我们可以在保持UTF-8为默认编码的条件下添加对这几个编码的支持,以解决中文乱码问题. 我想这个问题肯定有其他人 ...

  2. Sublime Text 2—解决中文乱码

    Sublime Text 2是一个非常棒的代码及文本编辑器,绿色小巧.速度飞快,跨平台支持Win/Mac/Linux,支持32与64位,支持各种流行编程语言的语法高亮.代码补全等,有着许多其他编辑器没 ...

  3. zabbix解决中文乱码问题(没有测试成功)

    zabbix解决中文乱码问题 1.在windows系统中找一个自己喜欢的字体,这里我们用:msyh.ttf 2.将字体上传至/var/www/html/zabbix/fonts目录下 [root@za ...

  4. 【原创】通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 ‘incorrect string value: '\xF0...

    这篇blog重点在解决问题,如果你对字符编码并不是特别了解,建议先看看 < [原创]通俗易懂地解决中文乱码问题(1) --- 跨平台乱码 >. 当然,如果只是针对解决这个Mysql插入报错 ...

  5. Debian 6解决中文乱码

    DEBIAN下中文显示 一.首先检查LOCALE情况 说明:DEBIAN因为基于GNU所以,对不同地域进行了不同的包支持,以LOCALE形式存在. 1.挂载ISO文件包,前8个ISO包就可以(这里不在 ...

  6. 04_过滤器Filter_02_Filter解决中文乱码问题

    [过滤器解决中文乱码问题实例] [工程截图] [web.xml] <?xml version="1.0" encoding="UTF-8"?> &l ...

  7. Web---演示servlet技术(servlet生命周期),解决中文乱码问题

    本节讲解决中文乱码问题的4种方法. 还有更好的方法,也就是用过滤器,这里就不演示了,博主目前也不会~呼♪(^∇^*)~过段时间才会学. servlet生命周期演示: index.jsp: <%@ ...

  8. 通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 ‘incorrect string value: '\xF0...

    原文:[原创]通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 'incorrect string value: '\xF0... 这篇blog重点在解决问题,如果你对 ...

  9. 解决中文乱码( jsp表单提交中文时出现乱码)

    有三种方法: 1.建立一个filter中文解决乱码 2.Struts2在struts.xml中修改默认的编码设定 3.用Spring解决中文乱码 4.直接在jsp中修改解决 1.建立一个filter解 ...

随机推荐

  1. IE8下submit表单没反应

    当在IE8浏览器下,例如以下代码<input type="submit" value="sub" />点击没反应.通常是因为表单里面嵌套了表单造成的 ...

  2. GBT算法在拖动滑块辨别人还是机器中的应用

    1.数据源格式:(x,y,t),第一个值x是x坐标范围是1-250的整数,y是1-10的整数,t是滑块从上一个坐标到下一个坐标的时间差,ok是判断是人操作的,Fail是判断是机器操作的,数据看的出,同 ...

  3. js 去掉重复数组

    js去掉重复数组 重点一:字符串转数组  strArr.join(',') 重点二:做循环数组删除的时候,每次循环就把color[i] 去对比i之前所有数组color组合起来的字符串 比如 : i=1 ...

  4. 1 最简单的hello world

    preface 今天我开始自学flask了,由此记录学习中的点点滴滴. 有问题请联系我(Mr.Leo 18500777133@sina.cn) include: 简介flask hello world ...

  5. Hessian资料

    introduction http://www.cnblogs.com/hzmark/archive/2012/11/27/Hessian.html 超时时间设置 http://www.tuicool ...

  6. Owe Her

    I owe her too much a wedding, i think i never pay her for it a life,

  7. SpringBoot------集成MyBatis

    1.pom.xml文件添加MyBatis和MySQL等依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns: ...

  8. 九度 1552 座位问题(递推DP)

    题目描述: 计算机学院的男生和女生共n个人要坐成一排玩游戏,因为计算机的女生都非常害羞,男生又很主动,所以活动的组织者要求在任何时候,一个女生的左边或者右边至少有一个女生,即每个女生均不会只与男生相邻 ...

  9. centos7 更改主机名

    在CentOS或RHEL中,有三种定义的主机名:a.静态的(static),b.瞬态的(transient),以及 c.灵活的(pretty).“静态”主机名也称为内核主机名,是系统在启动时从/etc ...

  10. mysql 查询锁表

    1)使用情景“判断通过后写入数据库”,这个一般是不会有问题的, 但并发访问的时候就不太好搞.因为写入(insert)是需要时间的,假设现在有两个并发请求,(假设第一个访问是最后一个符合条件的写入请求, ...