关于使用Ajax请求json数据,@RequestMapping返回中文乱码的几种解决办法

1、问题描述:

  使用ajax请求json数据的时候,不管如何返回的响应编码都是ISO-8859-1类型,由于统一都是utf-8编码,致使出现返回结果中文乱码状况。html

 1   $.ajax({
 2            type:"post",
 3            url:"http://...",
 4            data:JSON.stringify(data),
 5            dataType:"json",
 6            contentType:"application/json;charset=utf-8",
 7            success:function(data){
 8               //
 9            },
10            error:function(data){
11                //
12            }
13        })

  返回结果类型: ajax

  

2、缘由:

  使用了SpringMVC框架的@RequestBody 和 @ResponseBody两个注解,分别完成请求对象到对象响应的过程,一步到位,可是由于Spring3.x之后有了HttpMessageConverter消息转换器,把返回String类型的数据编码所有默认转换成iso-8859-1的编码格式,因此就出现了咱们遇到的乱码的状况,如返回list或其它则使用 MappingJacksonHttpMessageConverter。spring

  

3、解决办法:

  根据遇到的问题总结了三种可行的方案:json

  1.手动设置响应的的Content-type属性:浏览器

1 @RequestMapping(value = "/next_page.action",method = RequestMethod.POST,produces = {"text/html;charset=utf-8"})

 

  直接设置返回的属性,这样有个很差的地方是,每一个方法都要写一次produces,比较麻烦。session

  2.不使用@ResponseBody注解,直接经过response的方法返回数据mvc

1 @RequestMapping(value = "/next_page.action",method = RequestMethod.POST)
2     public void getUsersByPage(@RequestBody JSONObject params,HttpSession session,HttpServletResponse response) throws IOException {
3       
4         int page = Integer.parseInt(params.get("page").toString())-1;
5         List<User> ulist = null;
6         //。。。。
7         response.setContentType("text/html;charset=UTF-8");//这些设置必需要放在getWriter的方法以前,
8         response.getWriter().print(JSON.toJSONString(ulist));
9     }

 

  注意:response.setContentType必定要放在getWriter方法以前,不然编码设置将无效,由于它决定了该返回结果该以什么编码输出到客户端浏览器。不能颠倒。app

  3.使用注解方式修改默认响应编码设置:框架

 1 <!-- 注解驱动 -->
 2     <mvc:annotation-driven>
 3         <!-- 指定http返回编码格式,否则返回ajax请求json会出现中文乱码 -->
 4         <mvc:message-converters>
 5             <bean class="org.springframework.http.converter.StringHttpMessageConverter">
 6                 <property name="supportedMediaTypes">
 7                     <list>
 8                         <value>text/html;charset=UTF-8</value>
 9                         <value>application/json;charset=UTF-8</value>
10                         <value>*/*;charset=UTF-8</value>
11                     </list>
12                 </property>
13             </bean>
14         </mvc:message-converters>
15     </mvc:annotation-driven>

 

  在spring-servlet.xml配置文件中加入此配置,将修改转换器的默认编码方式为utf-8;此种方式会比较好用,由于一次配置就不会再有相同编码问题了,一次配置完美解决。post

  以上三个方法均可以完美解决此种乱码问题,可是仍是第三种配置方式最佳。

 

 

====

相关文章
相关标签/搜索