SpringMVC使用Ajax请求返回中文乱码

前言:
最近在描写一个JavaWeb后台时采用了spring+MyBatis+MySQL的办法.记录下遇到的关键问题

 

接口返回数据有关

使用@ResponseBody后返回NUll

说明:刚好把后台运行起来,兴高采烈的测试接口数据,结果无论如何都是回去null,

末段经各种百度过,发现本是不曾引入关键之Jar包.

解决办法:
需要引入jackson的jar包(jackson core和jackson mapper),引入后

图:

MyBatis 1

运@RequestMapping返回中文乱码

因剖析:(网上中心都是一模一样的答案)

首先:
确定的凡(经过反复测试的结果)只有当返回值是
String时才见面冒出中文乱码,而当返回值是Map<String,
Object>或者是另外品类时,并没有中文乱码的出现.

接下来找原因: 原因是当下足以说凡是spring
mvc的一个bug,spring
MVC有同样系列HttpMessageConverter去处理用@ResponseBody注解的回来值,如归list或任何则运用
MappingJacksonHttpMessageConverter,返回string,则动用
StringHttpMessageConverter,而者convert使用的凡字符集是iso-8859-1,而且是final的。所以当当回json中发生中文时不时见面现出乱码。

[java] view
plain
copy

  1. 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中补充加如下代码

[html] view
plain
copy

  1. <mvc:annotation-driven >  
  2.     <!– 信息转换器 –>  
  3.     <mvc:message-converters register-defaults=”true”>  
  4.       <bean class=”org.springframework.http.converter.StringHttpMessageConverter”>  
  5.         <property name=”supportedMediaTypes” value=”text/html;charset=UTF-8″/>  
  6.       </bean>  
  7.     </mvc:message-converters>  
  8.   </mvc:annotation-driven>  

原理: StringHttpMessageConverter的父类里发个List<MediaType>
supportedMediaTypes属性,用来存放
StringHttpMessageConverter支持用特别处理的 MediaType 类型,如果急需处理的
MediaType 类型不在 supportedMediaTypes列表中,则应用默认字符集。

最后结出:

呼吁方法1汉语乱码

伸手方法2回正确的华语

求方法3赶回正确的中文

品味方法二: 在部署文件中之mvc:annotation-driven中上加如下代码

[html] view
plain
copy

  1. <mvc:annotation-driven>  
  2.       <mvc:message-converters>  
  3.           <bean class=”org.springframework.http.converter.StringHttpMessageConverter”>  
  4.               <property name=”supportedMediaTypes”>  
  5.                   <list>  
  6.                    <span style=”white-space:pre”>   </span>  <value>text/html;charset=UTF-8</value>  
  7.                       <value>application/json;charset=UTF-8</value>  
  8.                       <value>*/*;charset=UTF-8</value>  
  9.                   </list>  
  10.               </property>  
  11.           </bean>  
  12.       </mvc:message-converters>  
  13.   </mvc:annotation-driven>  

原理: 原理及齐,但是这里多加了几乎单value。

最终结出:

恳请方法1华语乱码

呼吁方法2赶回正确的中文

伸手方法3回到正确的汉语

有关这种类型的法子为什么非可知科学解决,原因网上都是各不相同,这里呢不敢随意做出结论.总之,目前来拘禁这种方式不可知化解问题

品味方法三: 在@RequestMapping里的布局produces=”text/html;charset=UTF-8;”

[java] view
plain
copy

  1. @RequestMapping(value = “***”,produces=”text/html;charset=UTF-8;”)  

原理: 手动于相应的Accept返回制定格式编码数据。

末结出:

央方法1归正确的汉语

要方法2回正确的华语

请方法3无法请,出了摩,因为produces没有添加application/json;对应的头部.

尝试方法四: 在@RequestMapping里之面世配置produces={“application/json;”,”text/html;charset=UTF-8;”}

[java] view
plain
copy

  1. @RequestMapping(value = “***”,produces={“application/json;”,”text/html;charset=UTF-8;”})  

原理: 手动于相应之Accept返回制定格式编码数据。

说到底结果:

要方法1回到中文乱码

告方法2返回中文乱码

请方法3回来正确的华语

品尝方法五: 在@RequestMapping里之面世配置produces={“text/html;charset=UTF-8;”,”application/json;”}

[java] view
plain
copy

  1. @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,即可正常接收中文。

原稿连接:

SpringMvc
遇到的坑,返回中文乱码以及Ajax跨域

网站地图xml地图