问题导入:依旧是最近的那个毕业设计,在测试上传功能的浏览器兼容性的时候,发现ie下会有页面乱码,而其他浏览器都没有。
处理过程
根据IE的F12中的log提示,是因为http头信息中的编码替换了html文件中的编码。我最初的思路是设置Tomcat默认编码,但是我发现我已经在Server.xml中设置过,想到这里我想到了上篇文章的文件重命名的问题,准备去写个filter去修改http响应头,但是我突然明白,SpringMVC应该会处理过,但是为什么无效呢,这种成熟的框架不应该会有bug存在,于是我尝试在SpringMVC的xml中配置SourceHttpMessageConverter等转换器,都无效。
发现原因
后来发现web.xml是配置了编码处理的, 内容如下
<filter>
<filter-name>encodFilter</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>encodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
于是我追踪源码:
public class CharacterEncodingFilter extends OncePerRequestFilter {
private String encoding;
private boolean forceEncoding = false;
public void setEncoding(String encoding) {
this.encoding = encoding;
}
public void setForceEncoding(boolean forceEncoding) {
this.forceEncoding = forceEncoding;
}
@Override
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);
}
}
根据源码展示发现只有在forceEncoding为true或请求中的编码头不存在时才会设置我们定义的编码,forceEncoding默认是false,所以web.xml中设置的这段代码是无效的。
处理方案
所以修改web.xml如下
<filter>
<filter-name>encodFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>