什么是同源策略
瀏覽器出于安全方面的考慮,只允許與本域下的接口交互坷随。不同源的客戶(hù)端腳本在沒(méi)有明確授權(quán)的情況下,不能讀寫(xiě)對(duì)方的資源驻龟。
同源指的是 一樣的協(xié)議 温眉,一樣的域名,一樣的端口訪問(wèn)翁狐,3者要是有一個(gè)是不一樣的类溢,http請(qǐng)求就是跨域請(qǐng)求。
什么是跨域?跨域有幾種實(shí)現(xiàn)形式
因?yàn)闉g覽器的同源策略限制闯冷,不允許不同源下的對(duì)象互相操作砂心。去訪問(wèn)不同域的對(duì)象相互操作的就叫跨域。
JSONP:利用script的src標(biāo)簽的跨域?qū)傩陨咭瑐鬟f一個(gè)callback參數(shù)給服務(wù)端來(lái)獲取其他源的數(shù)據(jù)
CORS : 在第三方服務(wù)器端增加代碼辩诞,返回頭部設(shè)置Access-Control-Allow-Origin設(shè)置成指定的訪問(wèn)地址。
res.header("Access-Control-Allow-Origin", "http://a.jirengu.com:8080");
//res.header("Access-Control-Allow-Origin", "*");
- 降域:瀏覽器想要操作iframe標(biāo)簽中引入的網(wǎng)站纺涤,但是URL和本頁(yè)面的URL不同译暂,二級(jí)域名相同,以如下情況所示
http://a.xiexuan.com:8080/b.html
http://b.xiexuan.com:8080/a.html
document.domain = 'xiexuan.com' //便通過(guò)降域的方式使兩個(gè)網(wǎng)站可以實(shí)現(xiàn)跨域
- postMessage : 對(duì)不同域下的URL發(fā)送數(shù)據(jù)撩炊,如果對(duì)方接受數(shù)據(jù)外永,就可以使用,如果對(duì)方?jīng)]有監(jiān)控該數(shù)據(jù)拧咳,就無(wú)用伯顶。使用window.postMessage(值,傳遞的地址) 方法進(jìn)行跨域通信。
JSONP 的原理是什么
利用
<script>
標(biāo)簽沒(méi)有跨域限制的特性骆膝,比如引入線(xiàn)上的jquery庫(kù)(其他域下的js)祭衩,來(lái)達(dá)到與第三方通訊的目的。在本頁(yè)面中創(chuàng)建script標(biāo)簽阅签,src的地址執(zhí)行后端接口汪厨,最后加個(gè)參數(shù)callback=接口函數(shù)名;(由此約定函數(shù)名)
<script src="http://www.weather.com.cn?city=hangzhou&callback=showWeather"></script>
- 接口函數(shù)的名字和對(duì)數(shù)據(jù)的操作需要自己聲明和定義
<script>
function showWeather(json){
}
</script>
CORS是什么
CORS 全稱(chēng)是跨域資源共享(Cross-Origin Resource Sharing)愉择,是一種 ajax 跨域請(qǐng)求資源的方式
當(dāng)你使用 XMLHttpRequest 發(fā)送請(qǐng)求時(shí)劫乱,瀏覽器發(fā)現(xiàn)該請(qǐng)求不符合同源策略,會(huì)給該請(qǐng)求加一個(gè)請(qǐng)求頭:Origin锥涕,后臺(tái)進(jìn)行一系列處理衷戈,如果服務(wù)器端確定接受請(qǐng)求,則在返回結(jié)果中加入一個(gè)響應(yīng)頭:Access-Control-Allow-Origin层坠。瀏覽器判斷該相應(yīng)頭中是否包含 Origin 的值殖妇,如果有則瀏覽器會(huì)處理響應(yīng),我們就可以拿到響應(yīng)數(shù)據(jù)破花,如果不包含瀏覽器直接駁回谦趣,這時(shí)我們無(wú)法拿到響應(yīng)數(shù)據(jù)。所以 CORS 的表象是讓你覺(jué)得它與同源的 ajax 請(qǐng)求沒(méi)啥區(qū)別座每,代碼完全一樣.
在服務(wù)器增加代碼
res.header("Access-Control-Allow-Origin", "http://a.xiexuan.com:8080");
//res.header("Access-Control-Allow-Origin", "*"); // *表示服務(wù)器允許所有的跨域請(qǐng)求前鹅。