題目1: 什么是同源策略驻右?
瀏覽器出于安全方面的考慮突雪,只允許與本域下的接口交互起惕。不同源的客戶端腳本在沒有明確授權(quán)的情況下,不能讀寫對方的資源咏删。
http://a.jrg.com:8080/
1.http: 指協(xié)議惹想,其他協(xié)議有https\file\ftp\ssh\mailto\tel等
2.a.jrg.com: 指域名
3.8080: 指端口,默認端口號為80督函,若為80一般就不寫出來了
只要協(xié)議嘀粱、域名、端口有任何一個不同辰狡,都會被當作是不同的域锋叨。
同源舉例:
http://jrg.com/a/b.js 和 http://jrg.com/index.php
不同源舉例:
http://me.com/main.js 和 https://me.com/a.php (協(xié)議不同)
http://a.me.com/main.js 和 http://b.me.com/a.php (域名不同,域名必須完全相同才可以)
http://me.com/main.js 和 http://me.com:8080/a.php (端口不同宛篇,第一個是80)
需要注意: 對于當前頁面來說頁面存放的 JS 文件的域不重要娃磺,重要的是加載該 JS 頁面所在什么域
題目2: 什么是跨域?跨域有幾種實現(xiàn)形式叫倍?
跨域就是突破同源策略的限制偷卧,去不同的域下訪問數(shù)據(jù)
- JSONP (實際就是以加載js的方式,執(zhí)行拿到不同域名中的數(shù)據(jù))
-
CORS (在后端的返回頭部設(shè)置
Access-Control-Allow-Origin
添加允許訪問的域名) -
降域 (2者都設(shè)置
document.domain=" "
訪問的前后都要降域并且2者都要有同一個基礎(chǔ)域名吆倦,比如a.jrg.com
和b.jrg.com
听诸,降域后都為jrg.com
) - postMessage 在兩個窗口/frames間發(fā)送數(shù)據(jù)信息,但不是瀏覽器跟服務(wù)器之間交互逼庞,而是在兩個客戶端之間通信
題目3: JSONP 的原理是什么蛇更?
由于同源策略,XMLHttpRequest()
對象無法跨域赛糟,但<script>
派任、<img>
、<link>
等標簽是可以跨域的璧南。所以可以利用<script>標簽來向服務(wù)器發(fā)送請求掌逛。
- 通過script標簽引入一個js文件,在src中傳遞一個
callback=function
參數(shù)給服務(wù)端 - 服務(wù)端返回數(shù)據(jù)時會將這個callback參數(shù)作為函數(shù)名包裹住JSON數(shù)據(jù)
function([json數(shù)據(jù)])
- 當這個js文件載入成功后就會執(zhí)行我們指定的function回調(diào)函數(shù)司倚,并且會把我們需要的JSON數(shù)據(jù)作為參數(shù)傳入
題目4: CORS是什么豆混?參考
跨域資源共享(Cross-origin resource sharing),是一種ajax跨域請求資源的方式(支持現(xiàn)代瀏覽器动知,IE支持10以上)恬口。
實現(xiàn)方式:當使用 XMLHttpRequest
發(fā)送請求時粱坤,瀏覽器發(fā)現(xiàn)該請求不符合同源策略,會給該請求加一個請求頭:Origin
,后臺進行一系列處理兔甘,如果確定接受請求則在返回結(jié)果中加入一個響應(yīng)頭:Access-Control-Allow-Origin
; 瀏覽器判斷該相應(yīng)頭中是否包含 Origin
的值,如果有則瀏覽器會處理響應(yīng)享郊,我們就可以拿到響應(yīng)數(shù)據(jù)搪哪,如果不包含瀏覽器直接駁回,這時我們無法拿到響應(yīng)數(shù)據(jù)摊崭。
所以 CORS 的表象是讓你覺得它與同源的 ajax 請求沒啥區(qū)別讼油,代碼完全一樣。
比如發(fā)送了一個origin頭部:
Origin: http://a.jrg.com:8080
如果服務(wù)器(后端)認為這個請求可以接受呢簸,就在Access-Control-Allow-Origin頭部中發(fā)回相同的源信息:
Access-Control-Allow-Origin: http://a.jrg.com:8080
(與請求相同)
題目5: 根據(jù)視頻里的講解演示三種以上跨域的解決方式
cors
在服務(wù)端發(fā)送數(shù)據(jù)之前添加一個響應(yīng)頭矮台,允許該域名跨域獲取數(shù)據(jù)
降域
當a.jrg.com 想要操作 b.jrg.com的文件,可以通過兩者都添加document.domain = "jrg.com"
降域為jrg.com才能互相操作
缺點:只能用于相同的父級域名
PostMessage
postMessage的原理是會向另一個地方發(fā)送信息根时,另一個地方通常是iframe或者是由當前頁面彈出的窗口嘿架。
當父級頁面里包含了不同域里的iframe,可以通過這種方式來進行通信
當父級頁面可以通過postMessgae將內(nèi)容發(fā)送給子iframe啸箫∷时耄可以通過監(jiān)聽message事件,來獲取信息忘苛。
window.frames[0].postMessage(value,'*')
window.addEventListener('message',function(e) {
console.log(e.data);
});
iframe可以通過postMessgae將內(nèi)容發(fā)送給父頁面蝉娜。可以通過監(jiān)聽message事件扎唾,來獲取信息召川。
window.parent.postMessage(value,'*')
window.addEventListener('message',function(e) {
console.log(e.data);
});