由于瀏覽器處于安全考慮,在不同源的情況下,且未被許可時(shí),一個(gè)網(wǎng)頁(yè)使用只允許在本域下的接口交互。不同源的客戶端腳本在沒有明確授權(quán)的情況下,不能讀寫對(duì)方的資源。這就是同源策略。
同源策略(Same origin Policy):
本域的要求包括:
- 同協(xié)議名:都是 http 或都是 https 。
- 同域名:域名必須完全相同。
- 同端口:端口必須完全相同。
- http://jirengu.com:8000/main.js 與 http://jirengu.com:8000/a.php 為同源
- http://jirengu.com/main.js (瀏覽器默認(rèn)為80端口)與 http://jirengu.com:8000/a.php 則不同源
ajax也受到同源策略的束縛。
所以在某些情況下,只能使用JSONP或CORS等方式來解決問題。
需要注意一點(diǎn)的是:對(duì)于當(dāng)前頁(yè)面來說頁(yè)面存放的 JS 文件的域不重要,重要的是加載該 JS 頁(yè)面所在什么域
跨域的幾種實(shí)現(xiàn)形式
JSONP
HTML中的script標(biāo)簽可以引入其他域下的JS(不僅如此,凡是src這個(gè)屬性的標(biāo)簽,如img、script、iframe都具有跨域的能力),利用這個(gè)能力即可做到跨域的效果。
1、定義數(shù)據(jù)處理函數(shù)funN
2、創(chuàng)建script標(biāo)簽,其中src屬性根據(jù)根據(jù)需求設(shè)定
3、由于后端不知道前端數(shù)據(jù)處理函數(shù)的函數(shù)名,所以在src中添加callback=funN
4、當(dāng)后臺(tái)數(shù)據(jù)傳輸過來后,將會(huì)以funN(data)的形式對(duì)funN進(jìn)行調(diào)用,其data則是我們需要的參數(shù)。
CORS(Cross-Origin Resource Sharing)
CORS 全稱是跨域資源共享(Cross-Origin Resource Sharing),是一種 ajax 跨域請(qǐng)求資源的方式,支持現(xiàn)代瀏覽器,IE支持10以上。
1、當(dāng)你使用 XMLHttpRequest 發(fā)送請(qǐng)求時(shí),瀏覽器發(fā)現(xiàn)該請(qǐng)求不符合同源策略,會(huì)給該請(qǐng)求加一個(gè)請(qǐng)求頭:Origin。
2、后臺(tái)在返回結(jié)果中加入一個(gè)響應(yīng)頭:Access-Control-Allow-Origin。
3、瀏覽器判斷該相應(yīng)頭中是否包含 Origin 的值,如果有則瀏覽器會(huì)處理響應(yīng),我們就可以拿到響應(yīng)數(shù)據(jù),如果不包含瀏覽器直接駁回,這時(shí)我們無(wú)法拿到響應(yīng)數(shù)據(jù)。
所以 CORS 的表象是讓你覺得它與同源的 ajax 請(qǐng)求沒啥區(qū)別,代碼完全一樣。
事實(shí)上,只要你去發(fā)送請(qǐng)求,后臺(tái)都會(huì)返回請(qǐng)求,但是瀏覽器會(huì)進(jìn)行驗(yàn)證,你發(fā)送的請(qǐng)求是否是被允許的。
降域
兩個(gè)二級(jí)或以上域名網(wǎng)址想要跨域時(shí),可以通過降域,降至同一層域名,即可跨域。
如:http://a.jrg.com 與 http://b.jrg.com之間因?yàn)榉峭矗圆荒芸缬颉T趦蓚€(gè)頁(yè)面下都加入如下代碼,進(jìn)行降域,這兩個(gè)網(wǎng)站則可相互進(jìn)行跨域。
document.domain = 'jrg.com'
postMessage
兩個(gè)不同域名下的頁(yè)面之間,不相互讀取數(shù)據(jù)或進(jìn)行頁(yè)面操作,只是相互發(fā)送數(shù)據(jù),即可用postMassage。