最近开发微信服务号,遇到了一个问题,在编写自动回复消息的时候出现乱码,最后发现问题是由于spring mvc的@ResponseBody注解返回字符串时默认返回的是“ISO-8859-1”而不是utf-8。
虽然大家的项目里面可能都有字符编码过滤器,但是有一个问题在这里,我们设置response.setContentType("text/html; charset=utf-8");时都是在chain.doFilter(request, response);之前设置的,也就是过滤器前处理是设置的响应编码格式,之所以不在后处理时设置是因为后处理时响应内容已经生成此时设置是无效的,必须在响应内容生成之前设置响应编码格式。
那么问题就出在这个地方,我们虽然设置了响应编码格式,,,可是spring mvc在有@ResponseBody注解的响应是,篡改了我们的响应编码!!!!!!!!!为什么会这样。。。。。我们来剖析一下原因。
相信大家对spring的Message Converters不会陌生,HttpMessageConverters<T>这个接口是用来把请求信息转化为对象T,把T输出为响应信息的一个接口,在该接口众多的实现类中有一个实现类StringHttpMessageConverter
,这个类的作用就是把请求信息转换未字符串,而@ResponseBody注解就是默认调用的这个类,,,而这个类中默认的编码格式就是ISO-8859-1,,所以罪魁祸首找到了,怎么改呢?
我直接添加了
@RequestMapping(value = "/weixin/validation" , method = RequestMethod.POST , produces = "text/html;charset=UTF-8")
这样一个注释在控制器上,
/**
* 注意:
* "application/json" json格式数据
* "application/xml" xml类型数据
* "application/x-www-form-urlencoded" 基本类型 jquery默认就是采用的这种
* "multipart/form-data" 文件上传
* "text/xml" 和application/xml采用的默认编码格式不一样
* "text/html" 一般的html
*/
主要就是
produces = "text/html;charset=UTF-8"
这个配置当然还有很多别的方式,网上也有很多,我没有都尝试,这里把一些链接留下:
Spring MVC @ResponseBody响应中文乱码
Spring MVC @ResponseBody注解返回响应流时中文乱码问题的解决