1. 程式人生 > >ajax提交 後臺返回中文亂碼問題

ajax提交 後臺返回中文亂碼問題

介面返回資料相關

使用@ResponseBody後返回NUll

說明:剛把後臺執行起來,興高采烈的測試介面資料,結果無論如何都是返回null,最終通過各種百度,發現原來是沒有引入關鍵的Jar包.解決辦法: 需要引入jackson的jar包(jackson core和jackson mapper),引入後圖:

使用@RequestMapping返回中文亂碼

原因分析:(網上基本都是一致的答案)

首先: 確定的是(經過多次測試的結果)只有當返回值是 String時才會出現中文亂碼,而當返回值是Map<String, Object>或者是其它型別時,並沒有中文亂碼的出現.

然後找原因: 原因是這可以說是spring mvc的一個bug,spring MVC有一系列HttpMessageConverter去處理用@ResponseBody註解的返回值,如返回list或其它則使用 MappingJacksonHttpMessageConverter,返回string,則使用 StringHttpMessageConverter,而這個convert使用的是字符集是iso-8859-1,而且是final的。所以在當返回json中有中文時會出現亂碼。
  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中新增如下程式碼

  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中新增如下程式碼

  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;"

  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;"}

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

原理: 手動給對應的Accept返回制定格式編碼資料。最終結果:請求方法1返回中文亂碼請求方法2返回中文亂碼請求方法3返回正確的中文

嘗試方法五: 在@RequestMapping裡的併發配置produces={"text/html;charset=UTF-8;","application/json;"}

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

客戶端使用Ajax請求跨域問題

說明:剛剛搭建的Java web後臺程式,用Http請求很正常,但是用普通的ajax請求時,出現了一個跨域問題,被拒絕訪問.解決辦法:在.net後臺佈置在IIS伺服器上的,直接可以在IIS的應用池中配置Access-Control-Allow-Origin: *就行了.PhP後臺也只需要手動配置header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept');Java Web後臺可以再對應的tomcat伺服器上通過CORS配置跨域訪問(詳情見另一篇),這裡暫時只探討Java Web的JSONP實現於是:  這裡的Java Web後臺採用了JSONP傳輸方式來支援跨域.(缺點就是隻支援Get,而且需要伺服器端有JSONP的判斷,因為返回引數和普通的不一樣)JSONP前端程式碼:(這裡是用了JQ的jsonp請求)
  1. <span style="white-space:pre">                    </span>$.ajax(url, {  
  2.                         data: data,  
  3.                         dataType: "jsonp",  
  4.                         jsonpCallback: 'testGetData',  
  5.                         timeout: "15000", //超時時間設定為3秒;  
  6.                         type: "POST",  
  7.                         success: function(response) {  
  8.                             var result = 'success:' + JSON.stringify(response);  
  9.                             //返回的是utf8編碼,需要手動轉為utf16  
  10.                             console.log(result);  
  11.                             //alert(result);  
  12.                         },  
  13.                         error: function(error) {  
  14.                             var result = 'error:' + JSON.stringify(error);  
  15.                             console.log(result);  
  16.                             //alert(result);  
  17.                         }  
  18.                     });  

JSONP傳遞Java Web後臺程式碼片段:1.在方法的最開頭獲取是否是JSONP請求-通過獲取callback引數
  1. //判斷是否是jsonp請求  
  2. String jsoncallback = request.getParameter("callback");  
2.判斷如果是JSONP的請求則用JSONP的返回引數,否則用正常的(示例裡面使用了Jackson來輔助)
  1. public static String getJsonPData(String callbackName,Map<String, Object> data) throws JsonGenerationException, JsonMappingException, IOException{  
  2.         ObjectMapper mapper = new ObjectMapper();  
  3.         String json = mapper.writeValueAsString(data);  
  4.         System.out.println("jsonp回撥:"+callbackName);  
  5.         System.out.println("jackson解析的字串:"+json);  
  6.         String result = "";  
  7.         if(callbackName==null||callbackName==""){  
  8.             //普通請求  
  9.             result = json;  
  10.         }else{  
  11.             //jsonp請求,返回的格式是類似於一個函式的字串形式(前端再執行這個回撥來獲取資料)  
  12.             result = callbackName+"("+json+")";  
  13.         }  
  14.         System.out.println("最終結果:"+result);  
  15.         return result;    
  16.     }  

相關推薦

ajax提交 後臺返回中文亂碼問題

介面返回資料相關使用@ResponseBody後返回NUll說明:剛把後臺執行起來,興高采烈的測試介面資料,結果無論如何都是返回null,最終通過各種百度,發現原來是沒有引入關鍵的Jar包.解決辦法: 需要引入jackson的jar包(jackson core和jackson

87.ajax提交 後臺返回中文亂碼問題

介面返回資料相關 使用@ResponseBody後返回NUll 說明:剛把後臺執行起來,興高采烈的測試介面資料,結果無論如何都是返回null, 最終通過各種百度,發現原來是沒有引入關鍵的Jar包. 解決辦法: 需要引入jackson的jar包(jackson co

spring ajax以及頁面返回中文亂碼問題解決

clas ring 文件中 message prop div ann default pri 在spring配置文件中添加 <!--返回中文亂碼--> <mvc:annotation-driven > <!-- 消息轉

如何避免ajax提交資料出現中文亂碼

當我們使用Eclipse做WEB專案的時候,通過Eclipse啟動Web專案需要有對應的伺服器,比如tomcat。 如果使用的不是Eclipse自帶的tomcat,那麼對於tomcat字符集的設定是這個位置的server.xml中,以下以需要 UTF-8字符集為例: 在po

微信小程式後臺返回中文亂碼問題--gxy

wx.reqiest( ) 請求後臺返回的資料為: ???3???????56716,???16???????56701,???26???????56600,???24???????56459,???19???????56448,???28???????5

$.ajax()前臺資料傳至後臺中文亂碼問題

原因:對於在網路中傳輸的字元資料,不管其編碼為什麼,java總認為是“iso-8859-1”編碼,所以從前臺取到的資料如此處理:content = new String(前臺資料.getBytes("iso-8859-1"),"utf-8");//utf-8可以換成你程式設

ajax oracle 返回中文亂碼問題

1、首先確定後端伺服器頁面的輸出是否亂碼,我用的是php,連線oracle,在oci_connect的時候,注意加上一個引數。我用的是utf8 $conn=oci_connect('yuhairong','yuhairong','10.61.129.127/orcl','A

jQuery.form.js使用ajaxSubmit()提交表單時返回中文亂碼的問題

中文出現亂碼原因通常為編碼設定不一致,使用spring mvc + jQuery.form + jsp時儘量在以下三個地方都顯示設定編碼型別: Controller: @ResponseBody @

AJAX請求在使用@RequestMapping時返回中文亂碼

情況描述:使用SSM框架的專案,需要使用ajax請求並返回資料,但是設定所有伺服器端和瀏覽器客戶端的編碼都同一為:UTF-8結果還是亂碼。 原因分析:(網上基本都是一致的答案) 首先: 確定的是(經過多次測試的結果)只有當返回值是 String時才會出現

ajax get返回中文亂碼 (jsp)

解決如下: @RequestMapping(value = "/QueryData.do", method = RequestMethod.GET, produces="text/plain;charset=UTF-8") @ResponseBody     public

json在後臺封裝後,返回中文亂碼

Spring版本:3.*RELEASE 這裡統一轉換為utf-8 因為低版本的spring缺少許多方法,所以不能用produces 方案一、將json資料寫入PrintWriter 流中 @RequestMapping(value="/upload

Spring 4 MVC的post提交form時中文亂碼

pos track 亂碼 -a art charset ring value html 假設你發現Spring 4 MVC的Post請請求亂碼,請加入accept-charset的標簽為utf-8就能解決。例如以下: <form name=

Jquery 使用Ajax獲取後臺返回的Json數據後,頁面處理

[] object inpu empty 獲取 reader form 取數 oid <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtm

resin後臺輸出中文亂碼的解決辦法!

中文 Coding https -o 出現 blog XML bsp sam resin後臺輸出中文亂碼的解決辦法! 學習了:https://blog.csdn.net/kobeguang/article/details/34116429 編輯conf/resin.con

@ResponseBody註解返回中文亂碼

esp 中文亂碼 bsp ppi app span idt set body 第一種方法: @RequestMapping(value = "testPersonalValidtor",produces = "application/json;charset=utf-8")

前端處理後臺返回亂碼圖片

字符 http com api col The 返回 color 數據類型 問題描述: 請求後臺接口,返回如下圖的亂碼。 根據全場亂字符+JFIF標記,確定是個JPEG文件的二進制流,而不是base64。 解決方法: 1 this.$axios.get(‘ap

python requests返回中文亂碼

ons enc lxml nco res gb2 main def bs4   最近在使用python爬取高考分數線時,獲得的response裏面輸出了中文亂碼: from bs4 import BeautifulSoup import requests def get

js呼叫ajax根據後臺返回的總數前端設定每頁的條數實現分頁功能

有時候前端需要實現分頁功能,但是後臺只給我們返回來總數,每頁顯示多少條資料需要我們前端來設定,貌似這個有點欺負人,哈哈哈。。話不多說直接上程式碼: (這裡需要用到layui外掛,js檔案自己去官網下載哦) var pageNumber=1;//第幾頁 var sumCount=0; //總共

ajax請求後臺返回json的兩種處理方法

1.使用SpringMvc的@ResponseBody註解(直接將資料寫入到流中),這種方法需要在springmvc-config.xml檔案中進行編碼配置,具體如下 後臺程式碼: springmvc-config.xml配置檔案,需要新增jackson相關jar包: 2.直

SpringBoot返回中文亂碼問題(使用的是fastJson)

@SpringBootApplication //下面是自動注入的時候,排除資料庫 //@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) public class LearnSpringBootApplicat