近期因服务器到期 线上有个项目需要迁移到其他云服务器,早上迁移完程序 业务经过测试没啥大问题就没管了,下班后收到线上业务报警:
❓ 程序代码都没动过一行 怎么会签名错误 紧接着就开始排查问题 第一个想到是数据库的字符集问题 然后看了下数据库 发现字符集有点不对 然后都修改为utf8m4了 然后业务验证 还是没通过
[
{
"TPNO": "T002586",
"DHDBH": "105150996",
"FDBH": "111",
"SPCODE": "00011111",
"BARCODE": "00011111",
"JHXS": 200,
"SPWKSL": 0,
"JHDJ_HS": 2,
"JHJE_HS": 400,
"SCRQ": null,
"JHJS": 200,
"BZHL": 1,
"OMSCODE": "O2024052000169",
"FHTZD": "105150996-DCMBOL240521000008",
"DJLX": 0,
"SPMC": "???PET??????SGL-181?",
"SXID": null,
"SXMC": null,
"JDCKDBH": "OUT2024052100068"
}
]
紧接着就看了下运行日志,发现日志输出的商品名称都是乱码,最先想着日志乱码程序执行的时候总不至于乱码吧 然后就对着代码一顿检查 然后也没发现问题 因为编辑器的文件编码都是UTF-8 所以考虑应该是Tomcat 服务配置的问题
1、修改conf/server.xml 文件 增加了URIEncoding="UTF-8"
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxParameterCount="1000"
URIEncoding="UTF-8"
/>
2、修改conf/logging.properties 编码 默认就是UTF-8
然后重启服务 依旧乱码 下游系统依然返回签名错误 .......
最后没头绪了 只能求助谷歌 查询到可能的原因有三个地方conf/server.xml、conf/logging.properties和JDK的JAVA_OPTS参数设置 前两个我都逐一排查过了 那只能是JAVA_OPTS参数问题了,由于安装的时候设置过 tomcat/bin/catalina.sh 的JVM参数 JAVA_OPTS="-Xms1024m -Xmx4096m -Xss1024K"
紧接着在后面增加了 `-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8
`
重启服务,查看日志都不乱码了 ,再尝试请求下游接口
终于返回成功了 最终还是JVM虚拟机JAVA_OPTS参数中的编码设置起决定性作用 我悟了
评论区