由于同事离职需要接手一个开发进10年的struts项目,遇到了经典的中文乱码问题。
好好的项目,怎么到了我的手里,上传文件就变成乱码了呢?
仔细想想,排除了项目文件编码设置的情况,肯定是因为环境问题。
对比了生产环境,结果发现tomcat配置不一样。
这里先po出解决方案:
在tomcat/conf/server.xml文件中,将Connector添加如下两项配置URIEncoding和useBodyEncodingForURI。
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" redirectPort="8443"
URIEncoding="UTF-8" useBodyEncodingForURI="true"/>
至于这两个配置的含义可以百度,大概意思如下:
URIEncoding:对URI中出现的中文进行decode,解决X.do找不到执行类的问题。
useBodyEncodingForURI:解决queryString参数的乱码问题。
我的问题就是这个啦
上述两个配置不指定,默认值为ISO-8859-1
具体情况分析:
1.调试前台js代码从uploadstart()直到上传成功,文件名显示正常,页面中文名链接渲染正常,说明问题不在js前端;
2.请求跳转到后台Action后直接从request中拿到的filename就已经是乱码,并且基类中已经设置request.setCharacterEncoding("UTF-8");说明后台就是拿UTF-8去解析参数的,没有问题;
3.中文乱码使用new String(fid.getBytes("ISO-8859-1"),"UTF-8")测试才为正常中文名称,说明中间被什么中间件给转成万恶的ISO-8859-1了,事实上,就是tomcat!
心得体会:
代码问题不大的话,优先检查环境!