在乱码(一): 北京西直门迷路与乱码困惑 里, 笔者以"散文"的方式记叙了初次遇到乱码问题的心境. 不管心静好坏,问题还得要解决的. 在Linux 文件上传时目录汉字乱码问题??? 问答里, 记录了问题的起因以及围绕此问题的几次补充, 在此在特意感谢网友aone 的回答.
为了下文讨论的方便, 这里再简短介绍下问题. 是这样的, 项目没问题也已经要正式发布了, 测试时是在一台Linux系统(这里记为A机)上的, 但A机好像是坏了, 正式用就把项目部署到另一台Linux机(记为B机)上. 但出问题了, 在A机上跑的很好的文件上传代码出乱码了.
代码在A机上跑的好好的但在B机上不行, 应该是B机上配置有不合适的地方, 但A机坏了, 这样也就死无对证没法参考A机上的配置, 从头开始改配置.
为了能高效地解决问题, 先梳理下现在项目中防止乱码做的保证, 毕竟这是问题的出发点, 也对自己以后解决同类问题有很大的借鉴作用.
1, struts.xml文件中<constant name="struts.i18n.encoding" value="UTF-8"></constant>
2, web.xml中加了如下的Filter:
<filter>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3, 有的JSP文件中加如下代码:
<%@ page language="java" errorPage="/error.jsp" pageEncoding="gbk " contentType="text/html;charset=utf-8 "%>
大多JSP中是:
<%@ page language="java" errorPage="/error.jsp" pageEncoding="utf-8 " contentType="text/html;charset=utf-8 " %>
没有设置网上常见的:
<%
%>
看 CharacterEncodingFilter源码, 发现" request.getCharacterEncoding() == null ",也就是说,JSP页面中可能通过 (1)处的设置来覆盖这个filter中的配置.
if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null )) {
request.setCharacterEncoding(this.encoding);
if (this.forceEncoding && responseSetCharacterEncodingAvailable) {
response.setCharacterEncoding(this.encoding);
}
}
private final static boolean responseSetCharacterEncodingAvailable = ClassUtils.hasMethod(HttpServletResponse.class,"setCharacterEncoding", new Class[] {String.class});
4, Tomcat的server.xml文件中:
<Connector port="80" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding=" UTF-8 " useBodyEncodingForURI="true"/>
5, Java代码中负责Ajax响应的代码:
public void listCityByProId() {
getResponse().setHeader("Cache-Control","no-cache");
try{//response写信息
// do something here.
}catch(IOException e){
e.printStackTrace();
}
}
项目中用的是UTF-8的编码, 这是问题的出发点.