關於使用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

  以上三個方法均可以完美解決此種亂碼問題,可是仍是第三種配置方式最佳。

 

 

====

相關文章
相關標籤/搜索