最近遇到个问题,在浏览器中提交一个请求,包含中文值的参数,在服务器端接收到编码为ISO-8859-1
,而不是期望的UTF-8
,结果造成乱码。
应用的架构为jsp+tomcat+struts+postgresql。
通过排查和struts,postgresql都没有关系。Tomcat的默认的编码使用的ISO-8859-1
,参考tomcat faq一般通过以下几个步骤把整个环境设置为UTF-8
。
-
提交请求的页面
-
请求编码设置
我的问题很奇怪,通过上面的办法在servlet接收到的字符还是使用ISO-8859-1
编码。最后发现原来在这个应用中配置了个valve。在请求到达我的编码过滤器的时候,已经被getParameter(),这样就导致请求编码使用了默认的ISO-8859-1
。
解决方法是在该valve类的invoke方法开始的地方添加request.setCharacterEncoding("UTF-8");
附录
修改请求参数的方法:
因为请求是不可更改的,如果向请求参数map中put,会得到例外java.lang.IllegalStateException: No modifications are allowed to a locked ParameterMap
方法:自己实现一个HttpServletRequestWrapper
然后在修改请求的地方(例如一个过滤器)使用其中的2个setParameter()方法来修改请求参数。