一個域名位址的組成:

當協定、子域名、主域名、端口号中任意一個不相同時,都算作不同域。
不同域之間互相請求資源,就算作“跨域”。
比如:http://www.abc.com/index.html請求http://www.efg.com/service.php
JavaScript出于安全方面的考慮,不允許跨域調用其他頁面的對象。
什麼是跨域呢,簡單地了解就是因為JavaScript同源政策的限制,a.com域名下的js無法操作b.com或者是c.a.com域名下的對象。
ww.abc.com/index.html調用www.abc.com/service.php(非跨域)
ww.abc.com/index.html調用www.efg.com/service.php(跨域) 主域名不同
ww.abc.com/index.html調用bbs.abc.com/service.php(跨域) 子域名不同
ww.abc.com/index.html調用www.abc.com:81/service.php(跨域) 端口号不同
ww.abc.com/index.html調用https://www.abc.com/service.php(跨域) 不寫預設是http協定,協定不同,是以跨域。
子域名:
下面都是abc.com的子域名,可以有一級,也可以有多級,子域名不同就跨域了。
www.abc.com
bbs.abc.com
beijing.bbs.abc.com
haidian.beijing.bbs.abc.com
主要是後端做一個代理,跟前端沒關系。
通過在同域名的web伺服器端建立一個代理:
北京伺服器(域名:www.beijing.com)
上海伺服器(域名:www.shanghai.com)
比如在北京的web伺服器的背景
(www.beijing.com/proxy-shanghaiservice.php)來調用上海伺服器(www.shanghai.com/service.php)的服務,然後把響應結果傳回給前端,這樣前端調用北京同域名的服務就和調用上海的服務效果相同了。
JSONP解決主流浏覽器get請求的跨域資料通路問題。
在A域名去聲明一個方法,
載入B域名中的js,因為script可以跨域送出http請求。
B域名中載入的js中直接去調用a域名中聲明的方法。
借助script标簽,A域名去聲明,B域名去調用。
其實這種處理方式和XHR沒有太大關系了,隻是借助script标簽可以跨域通路的特性。
前端改造:
在get請求的代碼中需要修改一下dataType,從json改為jsonp。再增加一個屬性,這個名字就叫jsonp,值可以任意寫,比如叫callback。
也就是對代碼做了2處改動,
把dataType從json改成jsonp,
增加一jspnp的屬性取了個值叫callback。
後端改造:
在get請求的進行中擷取到callback, 前端jsonp參數取了個名字叫callback,是以後端就要擷取callback。
如果前端取callback123的話,後端就要擷取callback123。
發請求的時候jquery自動增加了一個參數,參數的名稱是callback123,參數的值是jquery自動生成的。
比如我實際應用中一例子:
發完ajax請求,網頁中請求的Headers的Request URL為:http://api.xxx.com/vipuser/grade?cb=jQuery18308066630555287624_1487902991956&username=xxx&token=xxx&format=jsonp
參數名cb,參數的值是jquery自動生成的。
這個值是:jQuery18308066630555287624_1487902991956
響應Response為:
傳回值:jQuery18308066630555287624_1487902991956({"message":"success","gradeInfo":{xxx},"code":"0","info":{xxx}})
傳回值前面是參數的值,一模一樣,後面用括号括起了要傳回的json對象。
最後注意一點:JSONP的原理隻能對get請求有效,不支援POST請求。
html5提供的XMLHttpRequest Level2已經實作了跨域通路以及其他的一些新功能。
IE10以下不支援XHR2這個标準。
使用
用戶端不需要什麼改造。
伺服器:隻需要設定2個伺服器頭。
header('Access-Control-Allow-Origin:*');後面有個*星号,*就是所有域都可以通路,當然也可以設定特點的域名。比如說我們伺服器在上海,可以在Access-Control-Allow-Origin後面設定一個北京伺服器的域名,隻有在北京的那個域名可以通路。
header('Access-Control-Allow-Methods:POST,Get');
本文轉自帥氣的頭頭部落格51CTO部落格,原文連結http://blog.51cto.com/12902932/1926154如需轉載請自行聯系原作者
sshpp