在SpringMVC的拦截器中response.setCharacterEncoding无效

BUG胡汉三 贵州开拓未来计算机技术有限公司 编码狗  2015-09-28 10:55:52
最近遇到了奇怪的乱码问题,有时频繁访问过后会出现响应中文乱码的情况!
郁闷的是不特定某一个页面乱码,几乎所有页面都有可能发生!
页面,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,着实令人懊恼!

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


...全文
829 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wuyde521 2016-04-06
还是需要改一下服务器编码设置的问题
回复
zszbcym 2016-01-30
楼主你解决了么?我最近也遇见这个问题了
回复
BUG胡汉三 2015-10-12
换了Tomcat的版本暂时没有测试出什么问题!现在用的Tomcat6.0.37
回复
BUG胡汉三 2015-09-29
引用 4 楼 defonds 的回复:
1. tomcat 默认编码 ISO-8859-1,你需要手工将其置为 UTF-8:修改 %tomcat%/conf/server.xml Connector 标签加属性 URIEncoding="UTF-8"; 2. 加过滤器进行编码过滤,如二楼所述; 3. 修改 jvm 系统编码(方法很多,比如修改底层系统编码,或者 jvm 启动参数里设置,或者在系统变量中设置 JAVA_TOOL_OPTIONS 配置编码为 UTF-8 等等... 以上尝试使用,或者结合使用,一般都能解决常见中文乱码问题。。 总之,编码格式保持一致,这是王道。
除了修改JVM的编码之外,其它的都试过了的!
回复
BUG胡汉三 2015-09-29
引用 3 楼 windowsoahil 的回复:
另一个同类问题,也没有解决 可以按他说的把response.setContentType("text/html;charset=utf-8");这句放出来试试 其实我没自己写过拦截器我也不太清楚,如果CharacterEncodingFilter也不行那是不是原理都是一样的……或者干脆把整个Adapter先关了看看还有没有乱码
加上了也木有效果!另外我在拦截器中拦截到响应编码为ISO-8859-1的时候做了跳转处理,本机可以但是服务器不行,老是502错误:

if(encoding.equals("ISO-8859-1")){
			String path = request.getContextPath()+request.getServletPath()+"?1=1";
			Map map = request.getParameterMap(); 
			StringBuffer bf = new StringBuffer();
			for (Object obj : map.keySet()) { 
				bf.append("&"+obj+"="+map.get(obj));
			} 
			System.out.println("我返回了false了:"+path+bf.toString());  
			response.sendRedirect(path+bf.toString());  
			return false;    
		}
回复
api工厂 2015-09-28
你少加了一个参数,在你 response.setCharacterEncoding("UTF-8"); 后面,再加一句: response.setContentType("text/plain; charset=UTF-8"); 就可以了
回复
Defonds 2015-09-28
1. tomcat 默认编码 ISO-8859-1,你需要手工将其置为 UTF-8:修改 %tomcat%/conf/server.xml Connector 标签加属性 URIEncoding="UTF-8"; 2. 加过滤器进行编码过滤,如二楼所述; 3. 修改 jvm 系统编码(方法很多,比如修改底层系统编码,或者 jvm 启动参数里设置,或者在系统变量中设置 JAVA_TOOL_OPTIONS 配置编码为 UTF-8 等等... 以上尝试使用,或者结合使用,一般都能解决常见中文乱码问题。。 总之,编码格式保持一致,这是王道。
回复
解开者 2015-09-28
另一个同类问题,也没有解决 可以按他说的把response.setContentType("text/html;charset=utf-8");这句放出来试试 其实我没自己写过拦截器我也不太清楚,如果CharacterEncodingFilter也不行那是不是原理都是一样的……或者干脆把整个Adapter先关了看看还有没有乱码
回复
BUG胡汉三 2015-09-28
引用 1 楼 windowsoahil 的回复:
我也不知道为啥……有时候会出这种问题,而且很难复现 不过有迂回手段,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>
已经设置了,木有效果哦亲!放在web.xml的最上面,还加上了<dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher>!之前我还加上了自己的过滤器也过滤了一下字符编码。还是不行.....崩溃中!
回复
解开者 2015-09-28
我也不知道为啥……有时候会出这种问题,而且很难复现 不过有迂回手段,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>
回复
相关推荐
发帖
Web 开发
创建于2007-09-28

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2015-09-28 10:55
社区公告
暂无公告