1、使用 SpringMVC 框架时,若是 HTTP 请求资源返回的是中文字符串,则会出现乱码。缘由以下:html
SpringMVC 框架能够使用 @RequestBody 和 @ResponseBody 两个注解,分别完成请求到对象和对象到响应的转换,底层这种灵活的响应机制,就是Spring3.X 新引入的 HttpMessageConverter 即消息转换器机制。该机制默认的编码为 ISO-8859-1。app
源码以下:框架
public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> { public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
2、那这种状况该怎么解决呢post
经本人测试有效的解决办法,有以下两个:测试
1. 在 @RequestMapping 里面加入 produces="text/html;charset=UTF-8"编码
@ResponseBody @RequestMapping(value="/logon",produces="text/html; charset=UTF-8") public String logon(){ }
这种方式的不足之处在于,咱们的每一个 controller 都须要这么配置,算是比较麻烦。spa
那还有其余省事的、一劳永逸的办法吗?有的。code
2. 使用 Spring 的后置处理器 BeanPostProcessorhtm
对这个类不太了解的,见:http://www.cnblogs.com/libra0920/p/6118157.html 有一个简单的说明。对象
在 bean 实例化以后,当 bean 的类型为 StringHttpMessageConverter 时,设置 @responseBody 返回数据编码为 utf8 格式。
/** * 实例化以后进行处理 */ public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if(bean instanceof StringHttpMessageConverter){ MediaType mediaType = new MediaType("text", "plain", Charset.forName("UTF-8")); List<MediaType> types = new ArrayList<MediaType>(); types.add(mediaType); ((StringHttpMessageConverter) bean).setSupportedMediaTypes(types); } return bean; }
以上。
摆脱乱码困扰。