记一次基于Java8下tomcat8.5 源码分析乱码bug

文章目录

描述:

tomcat8.5 在JRE为1.8的情况下会出现乱码,IDE是Eclipse。尝试使用了各种方法均失败,最后发现是Java8 rt.jar中bundle.getString方法引起的乱码,我们改不了Java8的源码,我们只能通过修改tomcat源码进行修复。

失败的尝试:

-Dfile.encoding=”UTF-8″
-Duser.region=US (可解决控制台输出乱码)

自定义拦截器,重新赋值headler头

server.xml中connector标签中添加 URIEncoding=”UTF-8″

DEBUG:

因为是通过测试错误页面错误信息判断乱码,就从错误流程开始追,我想其他正常的页面处理可能也会乱码

【断点】错误页面是在“org.apache.catalina.valves.ErrorReportValve”是这里组装发出的。

发现“org.apache.tomcat.util.res.StringManager”中getString(key) 方法返回乱码

继续跟:发现是ResourceBundle bundle在调用getString(key)时也返回异常。

bundle是Java8 源码,我们无法修改,通过查询发现返回的是ISO8859-1。处理方法也很简单,就是把ISO8859-1转成UTF-8。这里只是错误处理中需要这样,可能其他正常处理逻辑中也需要转换。

修复方法

# @位置:org.apache.tomcat.util.res.StringManager
# @方法 getString()
# @Line:130行
str = bundle.getString(key)
 替换成下面代码->
str = new String(bundle.getString(key).getBytes("ISO-8859-1"), "UTF8");
原文链接:记一次基于Java8下tomcat8.5 源码分析乱码bug