題目1: 什么是同源策略
瀏覽器出于安全方面的考慮,只允許與本域下的接口交互帜篇。不同源的客戶端腳本在沒有明確授權(quán)的情況下俊扭,不能讀寫對方的資源朝巫。
本域指
同協(xié)議:如都是http或者https
同端口:如都是80端口
如:
http://jirengu.com/a/b.js 和 http://jirengu.com/index.php (同源)
不同源的例子:
http://jirengu.com/main.js 和 https://jirengu.com/a.php (協(xié)議不同)
http://jirengu.com/main.js 和 http://bbs.jirengu.com/a.php (域名不同,域名必須完全相同才可以)
http://jiengu.com/main.js 和 http://jirengu.com:8080/a.php (端口不同,第一個是80)
- **需要注意的是: 對于當(dāng)前頁面來說頁面存放的 JS 文件的域不重要滥酥,重要的是加載該 JS 頁面所在什么域 **
題目2: 什么是跨域更舞?跨域有幾種實現(xiàn)形式
- 什么是跨域
- 允許不同域的接口進行交互
- 實現(xiàn)形式
- JSONP
html中script標(biāo)簽可以引入其他域下的js,比如引入線上的jquery庫坎吻。利用這個特性缆蝉,可實現(xiàn)跨域訪問接口。需要后端支持
echo $cb . '&&' . $cb . '(' . json_encode($ret) . ')';
定義數(shù)據(jù)處理函數(shù)_fun
創(chuàng)建script標(biāo)簽,src的地址執(zhí)行后端接口刊头,最后加個參數(shù)callback=_fun
服務(wù)端在收到請求后黍瞧,解析參數(shù),計算返還數(shù)據(jù)原杂,輸出 fun(data) 字符串印颤。
fun(data)會放到script標(biāo)簽做為js執(zhí)行。此時會調(diào)用fun函數(shù)穿肄,將data做為參數(shù)年局。
- CORS
CORS 全稱是跨域資源共享(Cross-Origin Resource Sharing),是一種 ajax 跨域請求資源的方式咸产,支持現(xiàn)代瀏覽器矢否,IE支持10以上。 實現(xiàn)方式很簡單脑溢,當(dāng)你使用 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ū)別汗菜,代碼完全一樣。 - 降域
- postMessage
題目3: JSONP 的原理是什么
- 后端將數(shù)據(jù)轉(zhuǎn)換成js代碼的格式
- 前端通過script標(biāo)簽接收來自后端的js代碼
- 再與前端已有的js代碼一起運行實現(xiàn)跨域獲取數(shù)據(jù)
題目4: CORS是什么
CORS 全稱是跨域資源共享(Cross-Origin Resource Sharing)挑社,是一種 ajax 跨域請求資源的方式陨界,支持現(xiàn)代瀏覽器,IE支持10以上痛阻。 實現(xiàn)方式很簡單菌瘪,當(dāng)你使用 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ū)別刨裆,代碼完全一樣。
題目5: 根據(jù)視頻里的講解演示三種以上跨域的解決方式 彬檀,寫成博客
- JSONP:代碼地址
- CORS:代碼地址
- 降域: 代碼地址
- postMessage :代碼地址
postMessage()方法允許來自不同源的腳本采用異步方式進行有限的通信帆啃,可以實現(xiàn)跨文本檔、多窗口窍帝、跨域消息傳遞努潘。
postMessage(data,origin)方法接受兩個參數(shù)
1.data:要傳遞的數(shù)據(jù),html5規(guī)范中提到該參數(shù)可以是JavaScript的任意基本類型或可復(fù)制的對象盯桦,然而并不是所有瀏覽器都做到了這點兒慈俯,部分瀏覽器只能處理字符串參數(shù),所以我們在傳遞參數(shù)的時候需要使用JSON.stringify()方法對對象參數(shù)序列化拥峦,在低版本IE中引用json2.js可以實現(xiàn)類似效果贴膘。
2.origin:字符串參數(shù),指明目標(biāo)窗口的源略号,協(xié)議+主機+端口號[+URL]刑峡,URL會被忽略,所以可以不寫玄柠,這個參數(shù)是為了安全考慮突梦,postMessage()方法只會將message傳遞給指定窗口,當(dāng)然如果愿意也可以建參數(shù)設(shè)置為"*"羽利,這樣可以傳遞給任意窗口宫患,如果要指定和當(dāng)前窗口同源的話設(shè)置為"/"。