AJAX请求在使用@RequestMapping时返回中文乱码
来源:互联网 发布:济南网络广告公司 编辑:程序博客网 时间:2024/06/09 15:15
博客来源:http://www.cnblogs.com/zique/p/6171862.html
情况描述:使用SSM框架的项目,需要使用ajax请求并返回数据,但是设置所有服务器端和浏览器客户端的编码都同一为:UTF-8结果还是乱码。
原因分析:(网上基本都是一致的答案)
首先: 确定的是(经过多次测试的结果)只有当返回值是 String时才会出现中文乱码,而当返回值是Map<String, Object>
或者是其它类型时,并没有中文乱码的出现.
然后找原因: 原因是这可以说是spring mvc的一个bug,spring MVC有一系列HttpMessageConverter去处理用@ResponseBody注解的返回值,如返回list或其它则使用 MappingJacksonHttpMessageConverter
,返回string,则使用 StringHttpMessageConverter
,而这个convert使用的是字符集是iso-8859-1,而且是final的。所以在当返回json中有中文时会出现乱码。
public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
解决办法(以及是否尝试成功): 尝试了很多种网上的办法,有一些根本无用,有一些当客户端的Accep是 application/json;时无用.最终也是结合客户端的修改才成功解决问题的。
环境: SpringMvc 3.1
客户端分为三种不同的请求:
1.浏览器中直接Get访问,Accept是”text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8”
2.用Jquery的jsonp ajax请求,Accept是”/”
3.用h5+环境下的mui ajax请求,Accept是”application/json;charset=utf-8”
(PS:h5+是最近做的跨平台移动项目的开发环境,另外就是有试过默认的Accept”application/json”的话不管服务器端用哪种方法,在呢么配置,都会返回乱码,所以最后只得手动加上charset=utf-8了)
注: 如果什么都不加,第一种和第二种都是返回的乱码,第三种由于手动要求了返回格式,所以没有乱码,这里之所以要第三组做对比是因为有一些方法会造成第三组不能正常访问。
尝试方法一: 在配置文件中的mvc:annotation-driven中添加如下代码
<mvc:annotation-driven > <!-- 消息转换器 --> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes" value="text/html;charset=UTF-8"/> </bean> </mvc:message-converters> </mvc:annotation-driven>
原理: StringHttpMessageConverter的父类里有个List supportedMediaTypes属性,用来存放 StringHttpMessageConverter支持需特殊处理的 MediaType 类型,如果需处理的 MediaType 类型不在 supportedMediaTypes列表中,则采用默认字符集。
最终结果:
请求方法1中文乱码
请求方法2返回正确的中文
请求方法3返回正确的中文
尝试方法二: 在配置文件中的mvc:annotation-driven中添加如下代码
<mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <span style="white-space:pre"> </span> <value>text/html;charset=UTF-8</value> <value>application/json;charset=UTF-8</value> <value>*/*;charset=UTF-8</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
原理: 原理同上,但是这里多加了几个value。
最终结果:
请求方法1中文乱码
请求方法2返回正确的中文
请求方法3返回正确的中文
关于这种类型的方法为什么不能正确解决,原因网上都是各不相同,这里也不敢轻易做出结论.总之,目前来看这种方法不能解决问题
尝试方法三: 在@RequestMapping里的配置produces=”text/html;charset=UTF-8;”
@RequestMapping(value = “*“,produces=”text/html;charset=UTF-8;”)
原理: 手动给对应的Accept返回制定格式编码数据。
最终结果:
请求方法1返回正确的中文
请求方法2返回正确的中文
请求方法3无法请求,出了错,因为produces没有添加application/json;对应的头部.
尝试方法四: 在@RequestMapping里的并发配置produces={“application/json;”,”text/html;charset=UTF-8;”}
@RequestMapping(value = “*“,produces={“application/json;”,”text/html;charset=UTF-8;”})
原理: 手动给对应的Accept返回制定格式编码数据。
最终结果:
请求方法1返回中文乱码
请求方法2返回中文乱码
请求方法3返回正确的中文
尝试方法五: 在@RequestMapping里的并发配置produces={“text/html;charset=UTF-8;”,”application/json;”}
@RequestMapping(value = “*“,produces={“text/html;charset=UTF-8;”,”application/json;”})
注意: 这里和上个方法的区别是,produces里面的顺序对调了
原理: 手动给对应的Accept返回制定格式编码数据。
最终结果:
请求方法1返回正确的中文
请求方法2返回正确的中文
请求方法3返回正确的中文
方法四和方法五对比分析:
发现produces设置多个Accept只有第一个的charset是有用的,
后面的Accept设置有效(因为不设置就无法接收对应的Accept请求),但是charset设置是无效的.需要客户端手动制定charset才行.
具体原因并不清楚(原谅我并不精通)
所以得出的结论是:
produces={“text/html;charset=UTF-8;”,”application/json;”}
这样设置,这样普通浏览器的请求就能正常显示中文,而客户端的模拟请求(可以是ajax或http)则手动指定Accept的charset,即可正常接收中文。
- AJAX请求在使用@RequestMapping时返回中文乱码
- SpringMVC使用Ajax返回中文乱码
- ajax返回中文乱码
- ajax返回中文乱码
- ajax请求,中文乱码
- ajax请求中文乱码
- ajax请求spring mvc controller,返回中文字符串显示乱码
- 关于ajax请求 后台返回中文数据乱码问题
- SpringMVC Ajax请求时返回json中文字符串的乱码问题的解决方案
- ajax返回中文时乱码的问题解决
- Ajax响应中文乱码 [SpringMVC使用@ResponseBody处理Ajax请求]
- Ajax响应中文乱码 [SpringMVC使用@ResponseBody处理Ajax请求]
- Ajax响应中文乱码 [SpringMVC使用@ResponseBody处理Ajax请求]
- Ajax响应中文乱码 [SpringMVC使用@ResponseBody处理Ajax请求]
- Ajax响应中文乱码 [SpringMVC使用@ResponseBody处理Ajax请求]
- Ajax响应中文乱码 [SpringMVC使用@ResponseBody处理Ajax请求]
- 使用ajax请求 返回Json出现乱码解决方法
- AJAX在servlet中返回中文乱码问题的解决
- jquery实现记住密码功能
- 我的梦之国度
- c++面试知识点
- linux常用命令
- Android常见的adb命令大全
- AJAX请求在使用@RequestMapping时返回中文乱码
- 关于origin和master
- JavaScript中this的指向问题
- webview实战
- 什么是ITSM Master?
- 每天一个linux命令(23):Linux 目录结构
- 排序算法C++&&Python实现---归并排序
- poj1860 Currency Exchange 最短路变形 spfa 判环 思考
- java i++的陷阱