前端面試必備之同源和跨域詳解

前言
眾所周知瀏覽器的同源策略及跨域的方法在前端面試中也是出場率極高的問題,本文主要跟大家分享了關(guān)于前端面試時(shí)會(huì)遇到的同源和跨域問題,下面話不多說了,來一起看看詳細(xì)的介紹吧。
什么是同源策略
同源策略是用來限制從一個(gè)源加載的文檔或者腳本如何與來自另一個(gè)源的資源進(jìn)行交互,是一種用于隔離潛在的惡意文件的關(guān)鍵的安全機(jī)制。
何謂同源
如果協(xié)議、域名和端口對于兩個(gè)頁面來說是相同的,則這兩個(gè)頁面就是同源的。比如:http://www.hyuhan.com/index.html 這個(gè)網(wǎng)站,協(xié)議是http,域名是www.hyuhan.com,端口是80(默認(rèn)端口),它的同源情況如下:
- http://www.hyuhan.com/other.html:同源
- http://hyuhan.com/other.html:不同源(域名不同)
- https://www.hyuhan.com/other.html:不同源(協(xié)議不同)
- http://www.hyuhan.com:81/other.html:不同源(端口不同)
同源策略是為了保護(hù)用戶信息的安全,受到同源策略限制的主要有以下幾種行為:
- Cookie、LocalStorage和IndexDB無法讀取
- DOM無法操作
- AJAX請求不能發(fā)送
如何進(jìn)行跨域訪問
怎么跨域進(jìn)行AJAX請求
主要由三種方法可以繞過同源策略的限制,來進(jìn)行跨域的AJAX請求。
JSONP
JSONP是客戶端與服務(wù)端跨域通信的常用的方法。利用可以跨域的<script&bt;元素,向服務(wù)器請求json數(shù)據(jù),服務(wù)端收到請求后,將數(shù)據(jù)放在一個(gè)回調(diào)函數(shù)中傳回來。實(shí)現(xiàn)如下:
window.onload = function() { var script = document.createElement('script'); script.src = "http://example.com/callback=test"; document.appendChild(script); } function test(res) { console.log(res); }
src的callback參數(shù)是用來設(shè)置后端需要調(diào)用的回調(diào)函數(shù)的名字的,服務(wù)器返回的數(shù)據(jù)如下:
test({ "name": "小明", "age": 24 })
這樣,前端就能跨域讀取后端的數(shù)據(jù)了。但是jsopn只能發(fā)生get請求,不能發(fā)送post請求。
WebSocket
WebSocket是一種基于TCP的新的網(wǎng)絡(luò)協(xié)議,它不實(shí)行同源策略,只要服務(wù)器支持,就可以進(jìn)行跨域訪問。而且WebSocket并不限于以Ajax方式通信,因?yàn)锳jax技術(shù)需要客戶端發(fā)起請求,而WebSocket服務(wù)器和客戶端可以彼此相互推送信息。
CORS
CORS是Access-Control-Allow-Origin(跨域資源共享)的縮寫,它是一個(gè)W3C的標(biāo)準(zhǔn)。CORS需要瀏覽器和服務(wù)器同時(shí)支持,目前基本所有的瀏覽器都支持該功能。服務(wù)器端對于CORS的支持,主要就是通過設(shè)置Access-Control-Allow-Origin來進(jìn)行的。如果瀏覽器檢測到相應(yīng)的設(shè)置,就可以允許Ajax進(jìn)行跨域的訪問。
document.domain
Cookie是服務(wù)器寫入瀏覽器的信息,安全起見,只有同源的網(wǎng)頁才能共享。但是,如果兩個(gè)網(wǎng)頁的一級域名相同,但是耳機(jī)域名不同的話,可以通過設(shè)置document.domain來共享Cookie。
比如,一個(gè)網(wǎng)頁域名是http://w1.example.com/a.html ,另一個(gè)網(wǎng)頁域名是http://w2.example.com/b.html ,只要給們設(shè)置相同的document.domain,這兩個(gè)網(wǎng)頁就可以共享Cookie。
postMessage API
postMessage()方法允許來自不同源的腳本采用異步方式進(jìn)行有限的通信,可以實(shí)現(xiàn)跨文檔、多窗口、跨域消息傳遞。用postMessage()函數(shù)傳遞消息,目標(biāo)頁面監(jiān)聽window的message事件接收消息。利用postMessage,我們可以跨域讀取LocalStorage和IndexDB還有DOM數(shù)據(jù)。
window.name
瀏覽器窗口有window.name的屬性,該屬性規(guī)定無論是否同源,只要在一個(gè)窗口里,前一個(gè)網(wǎng)頁設(shè)置了這個(gè)屬性,后一個(gè)網(wǎng)頁就可以讀取它。即在一個(gè)窗口(window)的生命周期內(nèi),窗口載入的所有的頁面都是共享一個(gè)window.name的,每個(gè)頁面對window.name都有讀寫的權(quán)限,window.name是持久存在一個(gè)窗口載入過的所有頁面中的。顯然,這是可以實(shí)現(xiàn)跨域訪問的。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
你可能不熟練的十個(gè)前端HTML5經(jīng)典面試題
求職者怎樣才能成功的面試上HTML5開發(fā)工程師崗位呢?除了要有一份精美的簡歷,還得做好充足的面試準(zhǔn)備,其中最重要的是需要了解一些用人企業(yè)常問的HTML5面試題和套路,下面2018-07-03- CSS是一門不斷在發(fā)展的“語言”,在我們?nèi)粘C嬖嚽岸斯ぷ鞯臅r(shí)候是必不可少的一個(gè)知識點(diǎn),下面這篇文章主要給大家分享介紹了關(guān)于前端面試必備之CSS3新特性的相關(guān)資料,文中2017-09-05
- HTML5想必大家都很熟悉了,因?yàn)樘嗟拿襟w在討論這一技術(shù)。所以當(dāng)我們在面試前端工作的時(shí)候,遇到html5相關(guān)的問題一點(diǎn)也不意外,想要順利通過前端面試?下面這篇文章就來跟2017-09-05
- 這篇文章主要介紹了最全的前端面試題 前端面試題集合,需要的朋友可以參考下2017-06-23
- 本書詳細(xì)的講解了前端開發(fā)面試知識點(diǎn)的大綱;和大家分享一下,感興趣的朋友可以過來看看2016-08-30
BAT及各大互聯(lián)網(wǎng)公司2014前端筆試面試題(Html,Css篇)
很多面試題是我自己面試BAT親身經(jīng)歷碰到的。整理分享出來希望更多的前端er共同進(jìn)步吧,不僅適用于求職者,對于鞏固復(fù)習(xí)前端基礎(chǔ)更是大有裨益2014-10-29- 今年的前端還是很火的,市場需求量特別大,從2月16日來廣州,進(jìn)行了為期2周的面試,3月份就入職了,下面分享我在一家公司的面試經(jīng)歷,感興趣的朋友一起看看吧2019-04-16