摘要:面試必考題吧,所以在這會(huì)詳細(xì)介紹以下內(nèi)容跨域產(chǎn)生的原因羅列最常用的解決方法分析各種方法原理羅列各種方法優(yōu)缺點(diǎn)什么是跨域由于瀏覽器廠商對(duì)安全性的考慮,提出了瀏覽器的同源策略做為解決方案。
面試必考題吧,所以在這會(huì)詳細(xì)介紹以下內(nèi)容
跨域產(chǎn)生的原因
羅列最常用的解決方法
分析各種方法原理
羅列各種方法優(yōu)缺點(diǎn)
什么是跨域由于瀏覽器廠商對(duì)安全性的考慮,提出了瀏覽器的同源策略做為解決方案。它是一個(gè)用于隔離潛在惡意文件的重要安全機(jī)制。同源即協(xié)議、域名、端口三者一致。不同源即跨域。
比如:當(dāng)你訪問了 餅夕夕的網(wǎng)站
// HTML // 餅夕夕.com 內(nèi)嵌 拼多多.com // JS // 由于沒有同源策略的限制,釣魚網(wǎng)站可以直接拿到別的網(wǎng)站的Dom // 所以 餅夕夕.com 可以在 拼多多.com 輸入賬號(hào)密碼處埋點(diǎn) const $iframe = window.frames["pinduoduo"]; const $pwd = $iframe.document.getElementById("password"); console.log(`你的密碼已泄露: ${$pwd}`)解決方案(主流)
1. JSONP -> get請(qǐng)求跨域
原理:script和img等標(biāo)簽沒有跨域限制
實(shí)現(xiàn)方案:(舉例)
// HTML 插入標(biāo)簽 // JS function say(name, age) { console.log(`${name}, ${age} 歲`) } // 服務(wù)器返回response say("zmz", 18) // 那么客戶端在script onload時(shí)會(huì)執(zhí)行say方法 // 結(jié)束
2. iframe+form實(shí)現(xiàn)post請(qǐng)求跨域
原理:利用form表單target屬性,將post請(qǐng)求提交給隱藏的iframe,使頁(yè)面不跳轉(zhuǎn)
var data = { name: "zmz", age: 18 } var url = "http://localhost/say"; var $iframe = document.createElement("iframe"); $iframe.name = "iframePost"; $iframe.style.display = "none"; document.body.appendChild($iframe); $iframe.addEventListener("load", function(e) { console.log($iframe.contentWindow) }) const form = document.createElement("form"); const ipt = document.createElement("input"); form.action = url; form.enctype = "application/json;" form.method = "post"; // 最核心的一行代碼 // 在指定的iframe中執(zhí)行form form.target = $iframe.name; for (var name in data) { ipt.name = name; ipt.value = data[name]; form.appendChild(ipt.cloneNode()); } form.style.display = "none"; document.body.appendChild(form); form.submit(); document.body.removeChild(form)
3. CORS 跨源資源共享
原理:新版XMLHttpRequest(ajax2.0)特性,服務(wù)器白名單
服務(wù)器端設(shè)置response.setHeader("Access-Control-Allow-xxx...
附:ajax2.0新特性
可以設(shè)置HTTP請(qǐng)求的時(shí)限xhr.timeout
可以使用FormData對(duì)象管理表單數(shù)據(jù)
可以上傳文件 >> 同上
可以請(qǐng)求不同域名下的數(shù)據(jù)(跨域請(qǐng)求)
可以獲取服務(wù)器端的二進(jìn)制數(shù)據(jù)xhr.responseType = "blob"
可以獲得數(shù)據(jù)傳輸?shù)倪M(jìn)度信息 xhr.upload.process
CORS分類
簡(jiǎn)單請(qǐng)求(自行搜索)
在請(qǐng)求頭信息中指定Origin
非簡(jiǎn)單請(qǐng)求
會(huì)發(fā)送預(yù)檢請(qǐng)求(options),返回狀態(tài)碼204
5. 代理
原理:服務(wù)器之間沒有跨域限制
具體實(shí)現(xiàn):
// Nginx配置 server{ # 監(jiān)聽9099端口 listen 9099; # 域名是localhost server_name localhost; # 匹配到都轉(zhuǎn)發(fā)到http://localhost:9871 location ^~ /api { proxy_pass http://localhost:9871; } }
5. postMessage
原理:postMessage可以處理各種瀏覽器窗口之間的通信問題。
具體實(shí)現(xiàn):
// 發(fā)送方 window.frames["crossDomainIframe"] iframe.postMessage("我想要數(shù)據(jù)", "http://localhost:8088") window.addEventListener("message", function () { if (e.origin === "http://localhost:2333") { console.log("收到", e.data) } } // 接收方 window.addEventListener("message", (e) => { if (e.origin === "http://localhost:8088") { console.log(e.data) e.source.postMessage("給,你要的數(shù)據(jù)", e.origin); } })
6. WebSocket
原理:新協(xié)議(socket)
實(shí)現(xiàn)方案:類似postMessage
附:
socket.io框架能解決兼容性問題
各種方式對(duì)比
JSONP和iframe+from兼容性很好
但是錯(cuò)誤處理和RESTful接口統(tǒng)一是個(gè)問題
CORS最簡(jiǎn)單粗暴
9102年了。微軟都不維護(hù)Win7了。
代理
肯定會(huì)慢一丟丟咯,而且要找運(yùn)維配
postMessage
處理窗口間通信,- -。不嫌麻煩可以用來跨域
WebSocket
處理長(zhǎng)連接,附帶跨域
End文章分享同步于: https://github.com/zhongmeizh...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/103003.html
摘要:在接觸前端開發(fā)起,跨域這個(gè)詞就一直以很高的頻率在我們學(xué)習(xí)工作中重復(fù)出現(xiàn),最近在工作中遇到了跨域的相關(guān)問題,這里我把它總結(jié)記錄一下。 在接觸前端開發(fā)起,跨域這個(gè)詞就一直以很高的頻率在我們學(xué)習(xí)工作中重復(fù)出現(xiàn),最近在工作中遇到了跨域的相關(guān)問題,這里我把它總結(jié)記錄一下。關(guān)于跨域,有N種類型,現(xiàn)在我只專注于ajax請(qǐng)求跨域(ajax跨域只是屬于瀏覽器同源策略中的一部分,其它的這里不做介紹),內(nèi)容...
摘要:跨域問題相信跨域問題是每個(gè)前端在請(qǐng)求中都會(huì)遇到的問題因?yàn)闉g覽器的同源策略的限制所以是不支持跨域的當(dāng)然當(dāng)后臺(tái)在沒有完成搭建的時(shí)候這時(shí)候我們需要使用到模擬數(shù)據(jù)的時(shí)候這時(shí)候很多的就會(huì)出現(xiàn)跨域問題在中當(dāng)然這個(gè)問題也不例外如下所以在此我也就整理出了 跨域問題 相信跨域問題是每個(gè)前端在ajax請(qǐng)求中都會(huì)遇到的問題,因?yàn)闉g覽器的同源策略的限制,所以ajax是不支持跨域的,當(dāng)然當(dāng)后臺(tái)在沒有完成搭建的...
摘要:服務(wù)端接收到請(qǐng)求后,通過該參數(shù)獲得回調(diào)函數(shù)名,并將數(shù)據(jù)放在參數(shù)中將其返回收到結(jié)果后因?yàn)槭菢?biāo)簽,所以瀏覽器會(huì)當(dāng)做是腳本進(jìn)行運(yùn)行,從而達(dá)到跨域獲取數(shù)據(jù)的目的。 在使用Vue搭建的一個(gè)后端管理系統(tǒng)中,我使用axios請(qǐng)求本地的Node環(huán)境下的接口,但是請(qǐng)求失敗,然后我錯(cuò)誤信息是:showImg(https://segmentfault.com/img/remote/1460000018521...
摘要:面試必考題吧,所以在這會(huì)詳細(xì)介紹以下內(nèi)容跨域產(chǎn)生的原因羅列最常用的解決方法分析各種方法原理羅列各種方法優(yōu)缺點(diǎn)什么是跨域由于瀏覽器廠商對(duì)安全性的考慮,提出了瀏覽器的同源策略做為解決方案。 面試必考題吧,所以在這會(huì)詳細(xì)介紹以下內(nèi)容 跨域產(chǎn)生的原因 羅列最常用的解決方法 分析各種方法原理 羅列各種方法優(yōu)缺點(diǎn) 什么是跨域 由于瀏覽器廠商對(duì)安全性的考慮,提出了瀏覽器的同源策略做為解決方案。它...
閱讀 1311·2021-11-24 10:24
閱讀 4088·2021-11-22 15:29
閱讀 1085·2019-08-30 15:53
閱讀 2788·2019-08-30 10:54
閱讀 1977·2019-08-29 17:26
閱讀 1271·2019-08-29 17:08
閱讀 605·2019-08-28 17:55
閱讀 1576·2019-08-26 14:01