瀏覽器出於安全方面的考慮,只容許與同源下的接口交互。javascript
所謂"同源"指的是"三個相同"。php
- 協議相同:如都是
http
或者https
- 域名相同:www.example.com/dir 和 www.example.com/dir2/
- 端口相同:如都是80端口
目前,若是非同源,共有三種行爲受到限制。html
- Cookie、LocalStorage 和 IndexDB 沒法讀取。
- DOM 沒法得到。
- AJAX 請求不能發送。
好比: 用戶打開了 頁面:baidu.com/yyy, 當前頁面下的 js 向 baidu.com/xxx的接口發 ajax 請求,瀏覽器是容許的。但假如向:google.com/xxx發ajax請求則會被瀏覽器阻止掉,由於存在跨域調用。前端
src
" 這個屬性的標籤都擁有跨域的能力,好比<script>
、<img>
、<iframe>
);callback
參數給服務端,而後服務端返回數據時會將這個 callback
參數做爲函數名來包裹住JSON數據,這樣客戶端就能夠隨意定製本身的函數來自動處理返回數據了。JSONP是服務器與客戶端跨源通訊的經常使用方法。java
它的基本思想是: 網頁經過添加一個 <script>
元素,向服務器請求JSON數據,而且該請求的查詢字符串有一個callback
參數,用來指定回調函數的名字,這種作法不受同源政策限制; 服務器收到請求後,將數據放在一個指定名字的回調函數裏傳回來。jquery
舉個栗子:程序員
請求方:frank.com 的前端程序員(瀏覽器)web
響應方:jack.com 的後端程序員(服務器)ajax
<script>
,src
指向響應方,同時傳一個查詢參數 ?callbackName=yyy
<script src="http://api.jirengu.com/weather.php?callbackName=showData"></script> 複製代碼
響應方根據查詢參數 callbackName
,構造形如json
ⅰ. yyy.call(undefined, '你要的數據')
ⅱ. yyy('你要的數據')
這樣的響應
以前後端返回數據: {"city": "hangzhou", "weather": "晴天"} 如今後端返回數據: showData({"city": "hangzhou", "weather": "晴天"}) 複製代碼
yyy.call(undefined, '你要的數據')
那麼請求方就知道了他要的數據這就是 JSONP。
用jQuery實現JSONP調用:
$.ajax({ url: "http://jack.com:8002/pay", dataType: "jsonp", success: function( response ) { if(response === 'success'){ amount.innerText = amount.innerText - 1 } } }) 複製代碼
答:
script
標籤實現的<script>
只能發送 get
請求