跨域

1. 什么是同源策略?
瀏覽器出于安全方面的考慮,只允許與本域下的接口交互。不同源的客戶端腳本在沒有明確授權(quán)的情況下,不能讀寫對方的資源。
同源的條件:
同協(xié)議:比如都是http或者https
同域名:比如都是http://xxx.com/ahttp://xxx.com/b(第一個/前面的是域名)
同端口:比如都是80端口

2. 什么是跨域?跨域有幾種實現(xiàn)形式
跨域就是越過同源策略的限制,在不同源的情況下之間交互。
實現(xiàn)形式有

  • jsonp
  • cors
  • 降域
  • postMessage

3. JSONP 的原理是什么
人們發(fā)現(xiàn)在頁面上通過url調(diào)用js文件時不受跨域的影響,所以通過創(chuàng)建script標簽,地址為后端的接口來跨域。jsonp需要傳遞以個callback參數(shù)給服務(wù)端,然后后端返回數(shù)據(jù)時會將這個callback參數(shù)作為函數(shù)名來包裹住JSON數(shù)據(jù),完成跨域訪問。

<script src="http://domain/api?param1=a&param2=b&callback=jsonp"></script>
<script>
    function jsonp(data) {
        console.log(data)
    }
</script>    

4. CORS是什么
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ū)別,代碼完全一樣。
CORS需要瀏覽器和后端同時支持。IE 8 和 9 需要通過 XDomainRequest 來實現(xiàn)。

瀏覽器會自動進行 CORS 通信,實現(xiàn)CORS通信的關(guān)鍵是后端。只要后端實現(xiàn)了 CORS,就實現(xiàn)了跨域。

服務(wù)端設(shè)置 Access-Control-Allow-Origin 就可以開啟 CORS。 該屬性表示哪些域名可以訪問資源,如果設(shè)置通配符則表示所有網(wǎng)站都可以訪問資源。


document.domain
該方式只能用于二級域名相同的情況下,比如 a.test.com 和 b.test.com 適用于該方式。

只需要給頁面添加 document.domain = 'test.com' 表示二級域名都相同就可以實現(xiàn)跨域


這種方式通常用于獲取嵌入頁面中的第三方頁面數(shù)據(jù)。一個頁面發(fā)送消息,另一個頁面判斷來源并接收消息

// 發(fā)送消息端
window.parent.postMessage('message', 'http://test.com');
// 接收消息端
var mc = new MessageChannel();
mc.addEventListener('message', (event) => {
    var origin = event.origin || event.originalEvent.origin; 
    if (origin === 'http://test.com') {
        console.log('驗證通過')
    }
});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容