阿里面試被跨域問題難倒後我決定系統學習一下相關知識

在電話面試時,被阿里面試官問了幾個跨域的問題,發現對跨域的瞭解,第一不成系統,第二太過片面,所以決定好好的學習一下。

什麼是跨域?

答:跨域其實就是違背了瀏覽器的同源策略,所以要想知道什麼是跨域,弄明白同源策略就可以了。


既然這樣,那請講一下瀏覽器的同源策略吧?

答:同源策略得先從同源說起,所謂的同源,需要同時滿足三個要求,否則就是跨域。

1.請求協議相同,比如a網頁用的是http協議,那麼a網頁下的b請求使用https,就不滿足同源的要求,可以判定為跨域了。

2.域名(ip)相同(阮一峰大神的博客上說的是域名相同),MDN博客上說是主機相同。這兩種說法似乎有點矛盾,因為一個主機上是可以布多個網站的,這裡也請看到的大神能指正一下,我也有點模糊。

3.端口相同。

不同網頁之間獲取cookie,LocalStorage,IndexDB,DOM,以及同一網頁下面的AJAX請求,只要違反了以上三點中的任意一點,都是跨域。


有一個需求,兩個網頁的一級域名相同,二級域名不相同,我想共享cookie,應該怎麼做呢?

答:這個時候可以通過將document.domain設置為兩個網頁共同的父域,來實現共享cookie。這個時候要注意一點,兩個域名的端口也會被設置成null。


想操作不同源的網頁dom,傳輸數據怎麼辦?

在網頁中包含一個iframe,想要互相操作dom,目前有以下4種方法。

1.如果兩個網頁的一級域名相同,可以通過設置document.domain來實現互相獲取dom的想法。

2.完全不同源的網頁,第一個可以用的方法是在頁面的url的#後面添加參數,然後通過window.onhashchange 監聽頁面的hash改變來獲取內容,間接進行dom操作。

比如,你想操作父窗口的url,可以通過parent.location.href= target + "#" + hash;來操作。

又如,你想操作子窗口的dom,可以通過

<code>var src = originURL + '#' + data;
document.getElementById('myIFrame').src = src;/<code>

不過在目前大量流行的單頁面應用利用hash來做路由的情況下,這個方法得謹慎使用。

3.通過改變window.name來實現數據互通。window.name不受跨域的影響,而且可容納的數據量大,可以通過監聽window.name來實現

4.使用windw.postMessage方法。

這個是h5為了解決跨域的問題新添加的一個api,允許跨域不同窗口之間通信。子窗口或者父窗口通過window.postMessage方法向對方發送一個消息,然後對方通過監聽message事件,來處理數據。

跨域的情況下ajax請求都有什麼好方法啊?

答,這個是有方法的。下面一一列舉。

1.JSONP方法。

因為script,iframe,image等不受同源策略的影響,所以可以利用這一點來實現ajax通信。JSONP就是通過動態動態創建script來和服務器通信。

具體的方法是手動創建和插入script標籤,然後服務端按照約定將數據通過回掉方法的方式返回過來,返回過來的數據因為是包裹在回掉方法中,因為是js文件,回掉方法會立刻執行。

2.用WebSocket通信。因為WebSOcket具有origin屬性,可以通過白名單來決定是否返回數據,從而不受同源策略的影響。

3.服務器端設置Access-Control-Allow-Origin為特定的域名,允許訪問。當然也可以設置為*,允許所有域名訪問,不過這個比較危險。

4.在本域名下搭建一個代理服務器,所有請求都由本域名所在服務器轉發


阿里面試被跨域問題難倒後我決定系統學習一下相關知識


分享到:


相關文章: