方法1、在web.xml文件中加入配置:
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
方法2、在springmvc配置文件中的上传文件配置
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"/>
<property name="defaultEncoding" value="UTF-8"></property>
</bean>
加入<property name="defaultEncoding" value="UTF-8"></property>即可。
下面解读下为什么这样配置就可以解决乱码问题了,
看下CommonsMultipartResolver,CommonsFileUploadSupport类中关于编码的方法:
protected String determineEncoding(HttpServletRequest request) {
String encoding = request.getCharacterEncoding();
if (encoding == null) {
encoding = getDefaultEncoding();
}
return encoding;
}
protected String getDefaultEncoding() {
String encoding = getFileUpload().getHeaderEncoding();
if (encoding == null) {
encoding = "ISO-8859-1";
}
return encoding;
}
public void setDefaultEncoding(String defaultEncoding) {
this.fileUpload.setHeaderEncoding(defaultEncoding);
}
protected CommonsFileUploadSupport.MultipartParsingResult parseRequest(
HttpServletRequest request) throws MultipartException {
String encoding = determineEncoding(request);
FileUpload fileUpload = prepareFileUpload(encoding);
try {
List fileItems = ((ServletFileUpload) fileUpload)
.parseRequest(request);
return parseFileItems(fileItems, encoding);
} catch (FileUploadBase.SizeLimitExceededException ex) {
throw new MaxUploadSizeExceededException(fileUpload.getSizeMax(),
ex);
} catch (FileUploadException ex) {
throw new MultipartException(
"Could not parse multipart servlet request", ex);
}
}
通过以上代码可以看到,如果通过
String encoding = request.getCharacterEncoding();获取的编码为null,并且配置文件中的defaultEncoding属性没有配置的话,程序就会使用
“ISO-8859-1”对上传的文件进行处理,所以会出现中文乱码的情况。
在看下CharacterEncodingFilter这个类对编码的处理:
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
if ((this.encoding != null)
&& (((this.forceEncoding) || (request.getCharacterEncoding() == null)))) {
request.setCharacterEncoding(this.encoding);
if (this.forceEncoding) {
response.setCharacterEncoding(this.encoding);
}
}
filterChain.doFilter(request, response);
}
可以看到这个类就是对request和response进行编码设置。。
建议:程序中统一使用一种编码格式,这样可以有效的解决乱码问题带来的困扰