中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Ajax中如何實現jsonp跨域請求

發布時間:2021-06-27 15:53:28 來源:億速云 閱讀:213 作者:小新 欄目:web開發

這篇文章主要介紹Ajax中如何實現jsonp跨域請求,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

什么是跨域?

簡單的來說,出于安全方面的考慮,頁面中的JavaScript無法訪問其他服務器上的數據,即“同源策略”。而跨域就是通過某些手段來繞過同源策略限制,實現不同服務器之間通信的效果。

具體策略限制情況可看下表:

URL說明允許通信
http://www.a.com/a.js
 http://www.a.com/b.js
同一域名下允許
http://www.a.com/lab/a.js
 http://www.a.com/script/b.js
同一域名下不同文件夾允許
http://www.a.com:8000/a.js
 http://www.a.com/b.js
同一域名,不同端口不允許
http://www.a.com/a.js
 https://www.a.com/b.js
同一域名,不同協議不允許
http://www.a.com/a.js
 http://127.0.0.100/b.js
域名和域名對應ip不允許
http://www.a.com/a.js
 http://script.a.com/b.js
主域相同,子域不同不允許
http://www.a.com/a.js
 http://a.com/b.js
同一域名,不同二級域名(同上)不允許
http://www.a.com/a.js
 http://www.b.com/b.js
不同域名不允許

什么是JSONP?

JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式,而JSONP(JSON with Padding)則是JSON 的一種“使用模式”,通過這種模式可以實現數據的跨域獲取。

JSONP跨域的原理

在同源策略下,在某個服務器下的頁面是無法獲取到該服務器以外的數據的,但img、iframe、script等標簽是個例外,這些標簽可以通過src屬性請求到其他服務器上的數據。利用script標簽的開放策略,我們可以實現跨域請求數據,當然,也需要服務端的配合。當我們正常地請求一個JSON數據的時候,服務端返回的是一串JSON類型的數據,而我們使用JSONP模式來請求數據的時候,服務端返回的是一段可執行的JavaScript代碼。

跨域: js有一個同源限制,簡單說來源不一樣的話就無法相互間交互.那么怎么算來源不一樣呢, 舉個例子:瀏覽器訪問-->服務器A--->得到頁面A---頁面A中的js腳本只能訪問服務器A的資源(相同域名和端口,此外域名與對應的ip也算不同源,要么都域名,要么都ip).

以上就是js的跨域問題,但是這里需要注意一點的是服務器A是沒有跨域的問題的,這個只有js存在這個問題,也就是說: 頁面A中js-->服務器A--->跨域資源,這個路徑是可以.只有 頁面A中的js--->跨域資源,這個路徑是不行的.

然后說一下解決方案中的jsonp,這個不是一種格式,而是一種解決方案.

jsonp的原理:js雖然有同源限制,但是引入js文件的時候卻沒有這個限制,也就是說:

<script type="text/javascript" src="xxx/xxxx.js"></script>

其中src屬性引入js文件的時候是沒有同源限制的,此時是可以引入域外資源的.jsonp的原理就在這里,通過動態的創建一個以上那行js引入語句,通過其src屬性訪問域外資源.而域外資源服務器只要返回一個能被解析為js語句的字符串即可達到返回結果的目的,形如:

callback({"key":"value",...})

其中callback是需要事先約定的名字,綠字部分為要返回到json字符串,然后拼接成以上那種形式直接返回即可.這樣頁面中的js從服務端接收到這個拼接的字符串后,就會直接執行本地的名為callback的js方法,這也就是為何callback這個需要事先約定的原因,需要保證頁面側要存在這個js方法,這個方法傳入的參數就為服務器側的返回值.

ajax是支持jsonp的,所以以上那些麻煩事情都會替我們做,寫法如下:

$.ajax({
     type: 'GET',
     url: "http://127.0.0.1:8080/xxx/xxx",
     async: false,
     dataType: "jsonp",
     jsonp: "callback",
     success: function(result){
       .....
     },
     timeout:3000 
  });

紅字部分標識我們使用jsonp的方式調用,實際上此時這個已經不是傳統意義上的ajax的get請求了,它的真實實現方式就是我們上文中說的那樣.其中紅字部分的callback為我們要和服務器端進行溝通的部分,這個請求發送到服務器端,實際上這樣的:

http://127.0.0.1:8080/xxx/xxx?callback=jqueryxxxx

服務器端需要通過callback來取值(類似用request.getParameter("callback")),也就是取后面的jqueryxxxx等自動生成的值,這個值實際上就是對應的我們發送請求的ajax方法中的success回調方法,服務器端如果返回

jqueryxxxx({"ret":"ok"})

頁面中會自動執行success方法,且將{"ret":"ok"}傳給success方法的參數result.

以上就是ajax通過jsonp的方式實現跨域訪問的過程.可以看出基本不用我們做什么額外操作,全都封裝好了.

ps:在jQuery中如何通過JSONP來跨域獲取數據

第一種方法是在ajax函數中設置dataType為'jsonp': 

$.ajax({
    dataType: 'jsonp',
    url: 'http://www.a.com/user?id=123',
    success: function(data){
        //處理data數據
    }
});

第二種方法是利用getJSON來實現,只要在地址中加上callback=?參數即可: 

$.getJSON('http://www.a.com/user?id=123&callback=?', function(data){
    //處理data數據
});

也可以簡單地使用getScript方法:

//此時也可以在函數外定義foo方法
function foo(data){
    //處理data數據
}
$.getJSON('http://www.a.com/user?id=123&callback=foo');

以上是“Ajax中如何實現jsonp跨域請求”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

桦甸市| 肃宁县| 临猗县| 克什克腾旗| 兴国县| 乐业县| 洞口县| 青田县| 五家渠市| 中山市| 枣阳市| 平泉县| 克拉玛依市| 五寨县| 和平县| 昆山市| 青河县| 塔河县| 万山特区| 抚顺县| 长沙市| 普定县| 宜君县| 栾城县| 泰州市| 玉田县| 彰化市| 吉林省| 桃园市| 泾川县| 岚皋县| 金沙县| 博罗县| 泰来县| 科技| 肇州县| 钟山县| 遂溪县| 青冈县| 高唐县| 万年县|