1偿乖、什么是同源策略
同源策略是瀏覽器出于安全性的考量而制定的策略矗钟,默認(rèn)情況下新症,XHR對(duì)象只能訪問(wèn)與包含它的頁(yè)面位于同一個(gè)域中的資源恳蹲,即限制了來(lái)自不同源的"document"或腳本對(duì)當(dāng)前"document"讀取或設(shè)置某些屬性虐块。
我們知道URL(document.URL)由協(xié)議(http/https/file/ftp)、域名(doucment.domain)嘉蕾、端口(port:3000/4000/80/8080)贺奠、還有路徑組成,如果兩個(gè)URL的協(xié)議错忱、域名儡率、端口(URL組成部分前3個(gè))相同,則表示他們同源以清。
a)a.b.com a.b.com/a.html 同源儿普,域相同。
b)b.com a.b.com 不同源掷倔,域不同眉孩。
c)a.b.com:8080 a.b.com/3000 不同源,端口不同今魔。
d)http://a.b.com https://a.b.com 不同源勺像,協(xié)議不同
2、 什么是跨域错森?跨域有幾種實(shí)現(xiàn)形式
跨域:跨域顧名思義就是突破同源策略的限制,去不同的域下訪問(wèn)數(shù)據(jù)篮洁。
實(shí)現(xiàn)形式:jsonp涩维、CORS:跨域資源共享(Cross-Origin Resource Sharing)、降域、postMessage()
3瓦阐、JSONP 的原理是什么
在html下引入script標(biāo)簽是可以請(qǐng)求不同源的數(shù)據(jù)蜗侈。那么也就是說(shuō)同源策略并沒有對(duì)script的src進(jìn)行監(jiān)測(cè),而且script的特性是在頁(yè)面加載時(shí)會(huì)訪問(wèn)script的src睡蟋,那么我們可以將這個(gè)src想象成一個(gè)簡(jiǎn)單的get請(qǐng)求踏幻,通過(guò)訪問(wèn)這個(gè)地址,我們可以配合后端對(duì)路由進(jìn)行參數(shù)配置戳杀,使這段訪問(wèn)的src中加入一些參數(shù)该面,從而靈活的從后端調(diào)取數(shù)據(jù)。我們甚至可以通過(guò)訪問(wèn)這個(gè)src來(lái)調(diào)用客戶端里存在的方法信卡,比如我們有一個(gè)function:
function jsonFn(param) { //do sth }
<script src='http://a.xx.com:3000/getSth?callback=jsonFn></script>
//與前面的jsonFn對(duì)應(yīng)隔缀,注意先后順序以防報(bào)錯(cuò): jsonFn is not defined.
//server-side - routes
app.get("/getSth", function(){
let data = req.query.callback + '(param)' ;//提取問(wèn)號(hào)后callback鍵值對(duì)兒的值并加工成函數(shù)調(diào)用形式的字符串。
res.send(data);
});
優(yōu)缺點(diǎn):
優(yōu)點(diǎn):它的兼容性更好傍菇,在更加古老的瀏覽器中都可以運(yùn)行猾瘸。
缺點(diǎn):它只支持GET請(qǐng)求而不支持POST等其它類型的HTTP請(qǐng)求。
4丢习、CORS是什么
CORS是一個(gè)W3C標(biāo)準(zhǔn)牵触,全稱是”跨域資源共享”(Cross-origin resource sharing)。它是一種AJAX跨域請(qǐng)求資源的方式咐低,對(duì)于開發(fā)者來(lái)說(shuō)荒吏,CORS通信與AJAX通信沒有差別。
它的實(shí)現(xiàn)方式很簡(jiǎn)單渊鞋,并且由瀏覽器自動(dòng)處理绰更,不需要做額外的工作。當(dāng)我們使用 XMLHttpRequest 發(fā)送請(qǐng)求時(shí)锡宋,假如瀏覽器發(fā)現(xiàn)請(qǐng)求不符合同源策略儡湾,就會(huì)給該請(qǐng)求加一個(gè)請(qǐng)求頭:Origin,后臺(tái)在處理時(shí)执俩,假如確定接收請(qǐng)求就會(huì)在返回結(jié)果中加一個(gè)響應(yīng)頭:Access-Control-Allow-Origin徐钠,再由瀏覽器自己判斷響應(yīng)頭中有沒有包含Origin的值,如果有瀏覽器就會(huì)處理響應(yīng)役首,我們就可以拿到數(shù)據(jù)尝丐,如果不包含瀏覽器就會(huì)拒絕,此時(shí)我們就無(wú)法拿到響應(yīng)數(shù)據(jù)衡奥。
優(yōu)缺點(diǎn):
優(yōu)點(diǎn):可以處理GET爹袁、POST等所有HTTP請(qǐng)求,不像JSONP那樣只支持GET請(qǐng)求矮固。使用時(shí)簡(jiǎn)單失息,只要服務(wù)器實(shí)現(xiàn)了CORS接口,就可以跨源通信。應(yīng)該說(shuō)CORS是最好的處理跨域的方式盹兢,它是跨域處理方案未來(lái)的趨勢(shì)邻梆。
缺點(diǎn):響應(yīng)的它的兼容性較差,IE瀏覽器不能低于IE10绎秒。
5浦妄、降域
與JSONP 和 CORS 不同,降域這種解決方案只適用于主域相同见芹,子域不同的用場(chǎng)景剂娄,一般主要用于頁(yè)面有 iframe 的情況。具體的原理很簡(jiǎn)單:兩個(gè)頁(yè)面都要通過(guò)JS來(lái)強(qiáng)制設(shè)置 document.domain 為基礎(chǔ)的主域辆童,就實(shí)現(xiàn)了降域跨域宜咒。
6、postMessage
postMessage()是HTML5引入的新API把鉴,主要被用來(lái)解決跨域和跨窗口消息傳遞等問(wèn)題故黑,它的應(yīng)用場(chǎng)景相對(duì)廣泛,可以被用于解決以下問(wèn)題:頁(yè)面和其打開的新窗口的數(shù)據(jù)傳遞庭砍、多窗口之間消息傳遞场晶、頁(yè)面與嵌套的iframe消息傳遞、上面三個(gè)問(wèn)題的跨域數(shù)據(jù)傳遞怠缸。
otherWindow.postMessage(message, targetOrigin, [transfer]);
我們通過(guò)給postMessage()方法設(shè)置參數(shù)來(lái)允許來(lái)自不同源的腳本采用異步方式進(jìn)行有限的通信诗轻,可以實(shí)現(xiàn)跨文本檔、多窗口揭北、跨域消息傳遞扳炬。postMessage有兩個(gè)參數(shù)。
message搔体,將要發(fā)送到其他 window的數(shù)據(jù)恨樟。
targetOrigin,通過(guò)窗口的origin屬性來(lái)指定哪些窗口能接收到消息事件疚俱,其值可以是字符串“*”(表示無(wú)限制)或者一個(gè)URI劝术。