问题描述:
在Controller中接收到的POST参数如果是中文的话,显示为乱码。已知客户端传过来时编码为UTF-8。
问题产生分析:
Spring MVC中默认的编码格式为“ISO-8859-1”,因此造成乱码。
解决方案:
所有的解决方案都是将编码转为UTF-8,至于方式,这里总结了3种,很明显第三种最好用。
①Controller传入参数为的HttpServletRequest类,获取到request,并调用
request.setCharacterEncoding("UTF-8");
来获取到UTF8格式的request,然后在取出参数就是正确的中文了。
举个栗子:
@RequestMapping("/login")
public @ResponseBody ResponseEntity<LoginInfo> login(HttpServletRequest request) {
LoginInfo li=new LoginInfo();
try {
request.setCharacterEncoding("UTF-8");
String nameString = request.getParameter("screen_name");
System.out.println(nameString);
} catch (Exception e) {
e.printStackTrace();
}finally {
return new ResponseEntity<LoginInfo>(li, HttpStatus.OK);
}
}
②仍然是使用@RequestParam获取参数,然后调用
str= new String(str.getBytes("ISO-8859-1"),"UTF-8");
注意处理异常。
以上两种方法都必须在每一个Controller函数中调用,太过麻烦。有没有一种全局配置方式,让参数能自动转为UTF-8呢?其实SpringMVC早就设计好了,在Web.xml中配置字符过滤器如下
<!-- 字符过滤器 -->
<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>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
好啦,至此问题就完美解决了。
需要注意,三种方法使用一个即可,使用两个的话,转两次又成乱码了。