当前位置: 代码迷 >> Java Web开发 >> 在SpringMVC的拦截器中response.setCharacterEncoding无效,该如何解决
  详细解决方案

在SpringMVC的拦截器中response.setCharacterEncoding无效,该如何解决

热度:33   发布时间:2016-04-13 22:18:03.0
在SpringMVC的拦截器中response.setCharacterEncoding无效
最近遇到了奇怪的乱码问题,有时频繁访问过后会出现响应中文乱码的情况!
郁闷的是不特定某一个页面乱码,几乎所有页面都有可能发生!
页面,SpringMVC,到数据库都是UTF-8的!
过滤器也设置了,就是没有作用,时不时的页面就出现乱码来。
加上拦截器后发现,乱码的时候输出的response.getCharacterEncoding()为:ISO-8859-1

public boolean preHandle(HttpServletRequest request,  
            HttpServletResponse response, Object handler) throws Exception {  
        // TODO Auto-generated method stub  
     // TODO Auto-generated method stub  
     System.out.println(request.getCharacterEncoding()); 
     response.setCharacterEncoding("UTF-8"); 
     System.out.println("=========================前置拦截器");
            System.out.println(response.getCharacterEncoding());
           // response.setContentType("text/html;charset=utf-8");
            System.out.println(response.getContentType());
            System.out.println("==============执行顺序: 1、preHandle================");   
        return true;  
    }

这是拦截器里面的代码,乱码的时候输出的结果为:

UTF-8
=========================前置拦截器
ISO-8859-1
null
==============执行顺序: 1、preHandle================

不明白的是,请求的编码为UTF-8,而我过滤器配置的也是UTF-8,在拦截器中输出之前也set的UTF-8为什么最后响应的确是ISO-8859-1,着实令人懊恼!

----------------
请诸位赐予我力量吧!



------解决思路----------------------
我也不知道为啥……有时候会出这种问题,而且很难复现
不过有迂回手段,web.xml再加一个filter:
	<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>/*</url-pattern> <!--设置你想过滤的页面或者是Servlet,根据自己的需要配置 -->
</filter-mapping>


------解决思路----------------------
另一个同类问题,也没有解决
可以按他说的把response.setContentType("text/html;charset=utf-8");这句放出来试试
其实我没自己写过拦截器我也不太清楚,如果CharacterEncodingFilter也不行那是不是原理都是一样的……或者干脆把整个Adapter先关了看看还有没有乱码
------解决思路----------------------
1. tomcat 默认编码 ISO-8859-1,你需要手工将其置为 UTF-8:修改 %tomcat%/conf/server.xml Connector 标签加属性 URIEncoding="UTF-8";
2. 加过滤器进行编码过滤,如二楼所述;
3. 修改 jvm 系统编码(方法很多,比如修改底层系统编码,或者 jvm 启动参数里设置,或者在系统变量中设置 JAVA_TOOL_OPTIONS 配置编码为 UTF-8 等等...
以上尝试使用,或者结合使用,一般都能解决常见中文乱码问题。。
总之,编码格式保持一致,这是王道。

------解决思路----------------------
你少加了一个参数,在你
response.setCharacterEncoding("UTF-8");
后面,再加一句:
response.setContentType("text/plain; charset=UTF-8");

就可以了
  相关解决方案