1. 程式人生 > >Spring mvc 實現jsonp和json數據類型

Spring mvc 實現jsonp和json數據類型

需要 直接 per 類的方法 blog children 接口 pre 自己

在使用springmvc開發rest接口的時候很方便,可以直接使用@ResponseBody註解,直接加在springmvc的控制器類的方法上,springmvc會直接為我們將返回的對象序列化成為json類型的數據, 但是有時候有的接口調用方需要我們直接返回jsonp類型的數據,這時候可能就會需要我們自己修改代碼,比如獲取請求參數callback屬性,手動序列化返回的對象,然後用callback參數中的值和手動序列化之後的數據進行拼接,然後組裝成jsonp類型的數據,但是有的接口調用方需要json類型的數據,還得需要我們手動進行判斷該請求是否需要組裝jsonp類型的數據進行返回,很不方便。 但是從springmvc4.0版本開始,springmvc為我們提供了自適應的返回結果,自動的將上面需要我們手動實現的方法進行封裝自動實現jsonp類型判斷和數據組裝,只需要我們繼承springmvc提供的一個抽象類,然後傳入需要進行jsonp類型請求的判斷參數即可,代碼如下:
@ControllerAdvice  
public class JsonpSupportAdvice extends AbstractJsonpResponseBodyAdvice { public JsonpSupportAdvice() { //參數包含callback的時候 使用jsonp的反饋形式 super("callback"); } }

別忘記添加註解@ControllerAdvice,只需要上面幾行代碼,springmvc就會為我們所有的json類型的請求提供jsonp數據的支持,只需要在請求的時候攜帶callback參數,springmv就會返回jsonp類型數據,如果沒有callback參數,springmv會返回正常的json數據。控制器的原有方法不做任何修改,也無需添加任何配置,輕松支持jsonp請求。

前端js ajax請求只需要改變 dataType:"jsonp",就可以了,其它的和之前的寫法是一樣的

js代碼如下:

 $.ajax({  
//          url:"http://localhost:8081/rest/itemcat/list?callback=getMessage",  
            url:"http://localhost:8081/children-watch-web-api/config/list",      
            type:"get",  
            cache:false,  
            dataType:
"jsonp", //jsonp:"callback", //這裏定義了callback的參數名稱,以便服務獲取callback的函數名即getMessage //jsonpCallback:"getMessage", //這裏定義了jsonp的回調函數 //如果不加回掉函數方法,jquery會自動加上 success:function(data){ // var dataList = eval(data.list); var html = ""; for(var i = 0;i < dataList.length; i++){ html += dataList[i].deviceId+"<br>"; } $("#myDiv").html(html); }, error:function(){ alert("發生異常"); } });

jsonp請求接口:

技術分享圖片

返回代碼示例:

/**/jQuery16108674314118078539_1515552287922({"list":[{"id":7,"deviceId":"7503276720","createDate":1514273113000}}],"code":0,"msg":"success"});

本域名訪問接口:

技術分享圖片

返回代碼示例:

{"list":[{"id":7,"deviceId":"7503276720","createDate":1514273113000}}],"code":0,"msg":"success"}

callback 函數是一種以參數形式傳遞給另一個函數的函數。

可以看到,jsonp返回的是一個方法,方法裏面是json數據,而本域名訪問就是返回的json數據,所以jsonp,就是通過方法回調來傳輸跨域數據的.

Spring mvc 實現jsonp和json數據類型