解决SpringMVC在IE页面返回乱码问题

来源:互联网 发布:罗技 淘宝 哪个是官方 编辑:程序博客网 时间:2024/06/04 19:56

问题导入:依旧是最近的那个毕业设计,在测试上传功能的浏览器兼容性的时候,发现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>
1 0
原创粉丝点击