花了半天 才 解决一个post中文乱码问题
2013-10-13 17:44 阅读(165)

半天时间并不长,  长的是这半天一直都在折磨人呀。。

一个小的编码设置问题,  正应了那句话了,会的不难、难的不会。


问题描述: post方式提交个表单,表单域中带有中文。编码通过过滤器设置,如下:


<filter>
		<filter-name>SetCharacterEncoding</filter-name>
		<filter-class>
			com.util.tool.SetCharacterEncodingFilter
		</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>

	<filter-mapping>
		<filter-name>SetCharacterEncoding</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>


但是request.getParameter()获得参数时,出现乱码。设置成get提交不会出现乱码。

获得characterEncoding 的值 是UTF-8, 说明过滤器已经起作用了。 通过new String(nick.getBytes("ISO-8859-1"), "utf-8")转换可以解决乱码, 说明此时的编码仍然是 ISO-8859-1。

问题在于为啥设置的编码没有起作用, 手动设置request.setCharacterEncoding("UTF-8"), 依然无效。 baidu, google了半天,也无果。  偶然,在查看svn提交记录时,发现有人又增加了个过滤器,用于解决session超时后续问题处理的。顺藤摸瓜找到这个过滤器, 发现里边有这样个方法,


问题找到了, 就出现在这个request.getParameter("target")上。  我们知道当request.getParameter()方法第一次被调用时,tomcat会将请求中的所有参数按照事先设定的编码解析出来,而不只是当前这个参数。由于后来增加的过滤器

被设置在了SetCharacterEncoding过滤器前边,所以调用request.getParameter("target")时utf-8编码还未被设置,而所有参数已经按默认编码ISO-8859-1解析出来了。

解决办法,将SetCharacterEncoding过滤器放到最前边,即可。