題目1: 什么是同源策略
同源策略限制從一個(gè)源加載的文檔或腳本如何與來(lái)自另一個(gè)源的資源進(jìn)行交互。這是一個(gè)用于隔離潛在惡意文件的關(guān)鍵的安全機(jī)制放可。目的就是為了保證用戶(hù)信息的安全皿曲,防止惡意的網(wǎng)站竊取數(shù)據(jù)唱逢。
那什么是源呢?如果協(xié)議屋休、域名、端口對(duì)于兩個(gè)頁(yè)面是相同的备韧,則兩個(gè)頁(yè)面具有相同的源劫樟。
舉例來(lái)說(shuō),http://www.example.com/dir/page.html這個(gè)網(wǎng)址织堂,協(xié)議是http://叠艳,域名是www.example.com,端口是80(默認(rèn)端口可以省略)易阳。它的同源情況如下:
http://www.example.com/dir2/other.html:同源
http://example.com/dir/other.html:不同源(域名不同)
http://v2.www.example.com/dir/other.html:不同源(域名不同)
http://www.example.com:81/dir/other.html:不同源(端口不同)
題目2: 什么是跨域附较?跨域有幾種實(shí)現(xiàn)形式
當(dāng) Web 資源請(qǐng)求由其它域名或端口(不同源)提供的資源時(shí),就發(fā)生了跨域請(qǐng)求潦俺【芸危跨域有幾種實(shí)現(xiàn)形式
1.JSONP
例如我要從域A的頁(yè)面pageA加載域B的數(shù)據(jù),那么在域B的頁(yè)面pageB中我以JavaScript的形式聲明pageA需要的數(shù)據(jù)事示,然后在 pageA中用script標(biāo)簽把pageB加載進(jìn)來(lái)早像,那么pageB中的腳本就會(huì)得以執(zhí)行。
function getData(data){
//這里是對(duì)獲取的數(shù)據(jù)的相關(guān)操作
console.log(data);
//數(shù)據(jù)獲取到后移除創(chuàng)建的script標(biāo)簽
document.body.removeChild(originData);
}
var originData = document.createElement('script');
originData.src = 'http://www.jesse.com/data.js';
originData.setAttribute("type", "text/javascript");
document.body.appendChild(originData);
2.CORS
跨源資源共享(CORS)定義一種跨域訪問(wèn)的機(jī)制肖爵,可以讓AJAX實(shí)現(xiàn)跨域訪問(wèn)卢鹦。CORS允許一個(gè)域上的網(wǎng)絡(luò)應(yīng)用向另一個(gè)域提交跨域AJAX請(qǐng)求。實(shí)現(xiàn)此功能非常簡(jiǎn)單劝堪,只需由服務(wù)器發(fā)送一個(gè)響應(yīng)標(biāo)頭即可冀自。它是通過(guò)客戶(hù)端+服務(wù)端協(xié)作聲明的方式來(lái)確保請(qǐng)求安全的。服務(wù)端會(huì)在HTTP請(qǐng)求頭中增加一系列HTTP請(qǐng)求參數(shù)(例如Access-Control-Allow-Origin等)秒啦,來(lái)限制哪些域的請(qǐng)求和哪些請(qǐng)求類(lèi)型可以接受熬粗,而客戶(hù)端在發(fā)起請(qǐng)求時(shí)必須聲明自己的源(Orgin),否則服務(wù)器將不予處理帝蒿,如果客戶(hù)端不作聲明荐糜,請(qǐng)求甚至?xí)粸g覽器直接攔截都到不了服務(wù)端。服務(wù)端收到HTTP請(qǐng)求后會(huì)進(jìn)行域的比較葛超,只有同域的請(qǐng)求才會(huì)處理暴氏。
3.降域
對(duì)于主域相同而子域不同的例子,可以通過(guò)設(shè)置document.domain的辦法來(lái)解決绣张。 具體的做法是可以在http://www.a.com/a.html和http://script.a.com/b.html兩個(gè)文件中分別加上 document.domain = "a.com"答渔;然后通過(guò)a.html文件中創(chuàng)建一個(gè)iframe,去控制iframe的contentDocument侥涵,這樣兩個(gè)js文件之間就可以 “交互”了沼撕。
4.postMessage
window.postMessage(message,targetOrigin) 方法是html5新引進(jìn)的特性宋雏,可以使用它來(lái)向其它的window對(duì)象發(fā)送消息,無(wú)論這個(gè)window對(duì)象是屬于同源或不同源务豺,目前IE8+磨总、FireFox、Chrome笼沥、Opera等瀏覽器都已經(jīng)支持window.postMessage方法蚪燕。
題目3: JSONP 的原理是什么
就是利用<script>標(biāo)簽沒(méi)有跨域限制的“漏洞”來(lái)達(dá)到與第三方通訊的目的。當(dāng)需要通訊時(shí)奔浅,本站腳本創(chuàng)建一個(gè)<script>元素馆纳,地址指向第三方的API網(wǎng)址,形如:
<script src="http://www.example.net/api?param1=1¶m2=2"></script>
并提供一個(gè)回調(diào)函數(shù)來(lái)接收數(shù)據(jù)(函數(shù)名可約定汹桦,或通過(guò)地址參數(shù)傳遞)鲁驶。
第三方產(chǎn)生的響應(yīng)為json數(shù)據(jù)的包裝(故稱(chēng)之為jsonp,即json padding)舞骆,形如:
callback({"name":"hax","gender":"Male"})
這樣瀏覽器會(huì)調(diào)用callback函數(shù)钥弯,并傳遞解析后json對(duì)象作為參數(shù)。本站腳本可在callback函數(shù)里處理所傳入的數(shù)據(jù)葛作。
題目4: CORS是什么
1寿羞、CORS是一個(gè)W3C標(biāo)準(zhǔn),全稱(chēng)是"跨域資源共享"(Cross-origin resource sharing)赂蠢。它允許瀏覽器向跨源服務(wù)器绪穆,發(fā)出XMLHttpRequest請(qǐng)求,從而克服了AJAX只能同源使用的限制虱岂。
2玖院、瀏覽器將CORS請(qǐng)求分成兩類(lèi):簡(jiǎn)單請(qǐng)求(simple request)和非簡(jiǎn)單請(qǐng)求(not-so-simple request)。
(1)對(duì)于簡(jiǎn)單請(qǐng)求第岖,瀏覽器直接發(fā)出CORS請(qǐng)求难菌。具體來(lái)說(shuō),就是在頭信息之中蔑滓,增加一個(gè)Origin字段郊酒。
(2)非簡(jiǎn)單請(qǐng)求是對(duì)服務(wù)器有特殊要求的請(qǐng)求,比如請(qǐng)求方法是PUT或DELETE键袱,或者Content-Type字段的類(lèi)型是application/json燎窘。非簡(jiǎn)單請(qǐng)求的CORS請(qǐng)求,會(huì)在正式通信之前蹄咖,增加一次HTTP查詢(xún)請(qǐng)求褐健,稱(chēng)為"預(yù)檢"請(qǐng)求(preflight),"預(yù)檢"請(qǐng)求用的請(qǐng)求方法是OPTIONS澜汤。瀏覽器先詢(xún)問(wèn)服務(wù)器蚜迅,當(dāng)前網(wǎng)頁(yè)所在的域名是否在服務(wù)器的許可名單之中舵匾,以及可以使用哪些HTTP動(dòng)詞和頭信息字段。只有得到肯定答復(fù)谁不,瀏覽器才會(huì)發(fā)出正式的XMLHttpRequest請(qǐng)求坐梯,否則就報(bào)錯(cuò)。