1: 什么是同源策略
瀏覽器出于安全方面的考慮,只允許與本域下(同協(xié)議/同域名/同端口)的接口交互。不同源的客戶端腳本在沒有明確授權的情況下,瀏覽器不能讀寫對方的資源。
2: 什么是跨域?跨域有幾種實現(xiàn)形式
跨域:當前執(zhí)行或加載的js文件所在頁面和該js里面請求消息的URL不同域。
跨域問題出現(xiàn)的場景:ajax請求不同域網(wǎng)站和iframe元素包含不同域網(wǎng)站。跨域請求數(shù)據(jù),后端都是提供了數(shù)據(jù)的,是瀏覽器判斷不同域攔截了數(shù)據(jù)
解決跨域問題的方式:
- jsonp
- CORS(Cross-Origin Resource Sharing,跨域資源共享)
- 降域
原理:主域名相同,二級域名不同,將二者的document.domain
設置為主域名,則降為同域了
使用場景:操作iframe - postMessage
不同域之間不能相互獲取數(shù)據(jù),但是可以主動向?qū)Ψ桨l(fā)送數(shù)據(jù),雙方各自監(jiān)聽數(shù)據(jù),然后自己決定是否使用該數(shù)據(jù)
3: JSONP 的原理是什么
實現(xiàn)基礎:html中script標簽可以引入其他域下的js。利用這個特性,可實現(xiàn)跨域訪問接口。需要后端支持
注:script標簽的作用,就是向src指向的地址發(fā)送請求,然后該地址返回數(shù)據(jù),瀏覽器將得到的數(shù)據(jù)作為js去執(zhí)行
** 實現(xiàn)方式:
1.定義數(shù)據(jù)處理函數(shù)_fun
2.創(chuàng)建script
標簽,src
的地址指向后端地址,在地址最后加個參數(shù)callback=_fun
3.服務端在收到請求后,解析參數(shù),計算返還數(shù)據(jù),輸出 fun(data)
字符串。
4.fun(data)
是后端返回的數(shù)據(jù),作為 js執(zhí)行**,即調(diào)用fun
函數(shù),data做為參數(shù)。
舉例:
在script里請求數(shù)據(jù):
<script src='http://www.weather.com.cn?city=chengdu&callback=showWeather'></script>
瀏覽器加載的js里面定義如下函數(shù):
<script>
function showWeather(json){
...
}
</script>
后端返回字符串(瀏覽器將其作為js執(zhí)行,即調(diào)用當前頁面加載js的函數(shù)showWeather
):
showWeather({
city: chengdu,
weather:{...}
})
缺點:有點復雜,不如ajax直白;容易出現(xiàn)xss攻擊(獲取的數(shù)據(jù)被當作js執(zhí)行,可能會盜取本地數(shù)據(jù)等)
4: CORS是什么
CORS(Cross-Origin Resource Sharing,跨域資源共享),是一種 ajax 跨域請求資源的方式,支持現(xiàn)代瀏覽器,IE支持10以上。 實現(xiàn)方式很簡單,當你使用 XMLHttpRequest 發(fā)送請求時,瀏覽器發(fā)現(xiàn)該請求不符合同源策略,會給該請求加一個請求頭:Origin,后臺進行一系列處理,如果確定接受請求則在返回結果中加入一個響應頭:Access-Control-Allow-Origin; 瀏覽器判斷該相應頭中是否包含 Origin 的值,如果有則瀏覽器會處理響應,我們就可以拿到響應數(shù)據(jù),如果不包含瀏覽器直接駁回,這時我們無法拿到響應數(shù)據(jù)。所以 CORS 的表象是讓你覺得它與同源的 ajax 請求沒啥區(qū)別,代碼完全一樣。
即在服務端返給請求方的http頭部,加上如下字段。瀏覽器判斷到response headers有如下字段,則不會攔截不同域數(shù)據(jù)。
Access-Control-Allow-Origin: 請求發(fā)起方的url 或者 *
5: 根據(jù)視頻里的講解演示三種以上跨域的解決方式
- jsonp(同上)
- cors(同上)
- 降域
二級域名間(不同域)嵌套操作時,使用document.domain = '主域名'
降域(同域) - postMessage
嵌套頁面互相發(fā)送postMessage,同時監(jiān)聽消息window.addEventListener('message',function(e) {})