今天在做一个非常简单的springmvc示例时,发现了一个非常神奇的东西
然后我为了解决这个bug就用了将近四个小时的时间。。。。
@ResponseBody
@RequestMapping(value="/user/login",method=RequestMethod.POST)
public String login(@RequestParam(value="username")final String username,
@RequestParam(value="password",required=false)final String password,
@RequestParam(value="vlacode",required=false)final String vlacode) {
可以看到我是将返回值设置为了String类型,这时在我进行测试的时候,那个神奇的东西发生了,返回给浏览器的数据竟然乱码了,我对此非常不解,以前的我没有返回过String类型,都是返回一个其他对象类型,并没有出现过这种情况。
于是我就慢慢排错,最一开始我以为编码问题吗,去配置一个编码过滤器就好了嘛,然后我就配置了一个CharacterEncodingFilter,然后发现还是不行,我看了一下源码,然后发现配置的版本不对,我以为就是版本的问题了,然后就去改版本,发现还是不行,我以为是我配错了,或者少配了东西,就去比着以前的项目改了改,然后,。。。我放弃了,去网上搜,因为我发现编码过滤器没有起作用,所以一直在去搜到底为什么编码过滤器不起作用,,,,,,结果可想而知,,,,,难受。。。。
然后我换了一个思路,因为发现只有返回String类型才会出错,然后 又去搜索了一下,原来是@ResponseBody的锅。。。。
原来spring MVC有一系列HttpMessageConverter去处理用@ResponseBody注解的返回值,如返回list或其它则使用 MappingJacksonHttpMessageConverter,返回String类型时,则使用 StringHttpMessageConverter,而这个convert使用的是字符集是iso-8859-1,而且是final的。
String 返回值类型取得的媒体类型为 text/plain;charset=ISO-8859-1,且使用 StringHttpMessageConverter 消息转换类。将该媒体类型设置为 response 的 contentType, 所以在当返回json中有中文时会出现乱码。
解决办法一:
手动给对应的Accept返回制定格式编码数据。在@RequestMapping设置produces
例:
@RequestMapping(produces= "application/json;charset=utf-8",value="/user/login",method=RequestMethod.POST)
解决办法二:
修改字符编码,如 springmvc.xml 文件加上如下配置:
<mvc:annotation-driven >
<!-- 消息转换器 -->
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/plain;charset=UTF-8"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>