出现状况:返回中文乱码
程序环境: 简单的SSM框架 ,前端get请求,后台controller层,方法上 @RequestMapping @ResponseBody ;
原因:@ResponseBody 这个注解指定返回的类型为 Json 而 底层
由于spring默认对String类型的返回的编码采用的是 StringHttpMessageConverter
>>> spring mvc的一个bug,spring MVC有一系列HttpMessageConverter去处理用@ResponseBody注解的返回值,如返回list则使用MappingJacksonHttpMessageConverter,返回string,则使用StringHttpMessageConverter,这个convert使用的是字符集是iso-8859-1,而且是final的:
public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
最开始 设置响应的类型 但是没有效果...
response.setContentType("text/html;charset=UTF-8"); //没有效果
response.setCharacterEncoding("utf-8"); //没有效果
解决方案
1、配置mvc注解 在applicationContext.xml中加入:
<!-- mvc注解驱动(功能更加强大) -->
<mvc:annotation-driven>
<!--解决响应中文乱码-->
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8" />
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
2、用HttpServletResponse 以流的形式响应到页面
(不能加@ResponseBody 它表示返回的类型 是 Json类型的数据)
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("utf-8");
PrintWriter pw = response.getWriter();
pw.println("要响应的内容");