由于同事離職需要接手一個開發(fā)進10年的struts項目,遇到了經典的中文亂碼問題。
好好的項目,怎么到了我的手里,上傳文件就變成亂碼了呢?
仔細想想,排除了項目文件編碼設置的情況,肯定是因為環(huán)境問題。
對比了生產環(huán)境,結果發(fā)現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找不到執(zhí)行類的問題。
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!
心得體會:
代碼問題不大的話,優(yōu)先檢查環(huán)境!