半天时间并不长, 长的是这半天一直都在折磨人呀。。
一个小的编码设置问题, 正应了那句话了,会的不难、难的不会。
问题描述: 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过滤器放到最前边,即可。