摘要:解決方案跨域問(wèn)題可以說(shuō)在前端方面不可避免,但同源策略畢竟在保護(hù)網(wǎng)絡(luò)信息安全方面起到很大的作用。
起因
說(shuō)起來(lái)源...今天去茶水間倒水時(shí),偶然聽(tīng)到公司面試官在問(wèn)面試者前端跨域的如何解決。我心中默默想了一想,啪啪啪瞬間想出幾個(gè)關(guān)鍵詞,iframe,cors,同源策略,jsonp...轉(zhuǎn)念一想,雖然這是很常見(jiàn)的面試題,然而我在開發(fā)過(guò)程中,還真沒(méi)有用過(guò)jsonp這種方式...就連原理也說(shuō)不好。一陣?yán)浜梗? ,趕緊去找了相關(guān)資料。
同源策略對(duì)于同源策略,在這里我就不多累贅敘述了,簡(jiǎn)單來(lái)說(shuō),如果以下三項(xiàng):同一協(xié)議、同一域名、同一端口但凡有一項(xiàng)不滿足,瀏覽器就會(huì)把 No "Access-Control-Allow-Origin" header is present on the requested resource甩你一臉。
解決方案跨域問(wèn)題可以說(shuō)在前端方面不可避免,但同源策略畢竟在保護(hù)網(wǎng)絡(luò)信息安全方面起到很大的作用。試想如果沒(méi)有同源策略,別的網(wǎng)頁(yè)可以輕松竊取你的cookie,而假如你的cookie中存有你的個(gè)人信息...太可怕了,不過(guò)話說(shuō)回來(lái)同源策略帶來(lái)的跨域問(wèn)題也很頭疼,幸好現(xiàn)在已經(jīng)有多種方式能夠解決。
CORS 跨域資源共享策略(
JSONP
window.name
document.domain(主域相同的情況下可用)
postMessage(h5新引入)
websocket(h5新引入,不受同源策略限制,所以說(shuō)h5真是個(gè)好東西...?)
...
由于篇幅有限(好吧...其實(shí)是我寫不了那么多),在這里對(duì)于其他解決方式就不一一詳解了。
正主來(lái)了,JSONPJSONP 是 JSON with Padding的簡(jiǎn)稱,是一種較為常用的解決跨域訪問(wèn)的方式。我們先來(lái)看一段示例代碼:
ajax({//此ajax方法是封裝了XMLHttpRequest對(duì)象實(shí)現(xiàn),具體代碼與本文無(wú)關(guān)就不貼了 method : "get", url : "http://127.0.0.1:8787", data : { "name" : "小明",//此ajax方法會(huì)自動(dòng)將數(shù)據(jù)以get方式提交 "age" : 22 }, success : function (message) { alert(message); }, async : true })
上面的代碼很簡(jiǎn)單,瀏覽器端發(fā)起了一個(gè)異步ajax請(qǐng)求,讓我們來(lái)看看服務(wù)端代碼:
app.get("*", function(req, res) {//這里只截取了關(guān)鍵代碼 res.send("測(cè)試數(shù)據(jù)"); });
清晰,易懂~so,what happend?
不出所料,瀏覽器甩了我一臉...
易地再戰(zhàn)!JSONP炸裂出場(chǎng)~
function showJsonp(obj){ console.log(obj.message); } var url = "http://127.0.0.1:8787/?func=showJsonp" var script = document.createElement("script"); script.setAttribute("src",url); script.setAttribute("type","text/javascript"); document.getElementsByTagName("head")[0].appendChild(script);
再來(lái)后臺(tái)代碼~
app.get("*", function(req, res) { let callback = req.query.func; let content = callback+"({"message":"測(cè)試數(shù)據(jù)2"})"; res.send(content); });
結(jié)果:
大!獲!全!勝!
是時(shí)候分析一波戰(zhàn)術(shù)策略了~在平常寫代碼的時(shí)候,可能很多人沒(méi)有注意,瀏覽器對(duì)于script,iframe等標(biāo)簽的src等屬性,是沒(méi)有同源策略限制的。而jsonp就很好的利用了這一點(diǎn)~在我們發(fā)起請(qǐng)求時(shí),url后跟了一個(gè)名為func的參數(shù),而這個(gè)參數(shù)就是之后需要用到的回調(diào)函數(shù)名稱。
我們通過(guò)動(dòng)態(tài)插入script標(biāo)簽的方式,利用script標(biāo)簽的src屬性發(fā)起請(qǐng)求,瀏覽器不會(huì)以同源策略來(lái)找事...而后臺(tái)根據(jù)請(qǐng)求構(gòu)造出的數(shù)據(jù)長(zhǎng)啥樣呢?
showJsonp({"message":"測(cè)試數(shù)據(jù)2"})
告訴我!這段代碼插入你的script標(biāo)簽內(nèi)后,會(huì)發(fā)生啥?!
當(dāng)然是執(zhí)行早就定義好的showJsonp函數(shù)啊~
bingo,完美解決跨域問(wèn)題~~
jsonp的方式兼容性非常好,即便是那些老古董瀏覽器,也可以用jsonp的方式解決跨域問(wèn)題,但是它也有所限制,它只能使用get方式發(fā)起請(qǐng)求,并且對(duì)于不同域之間頁(yè)面的js互相調(diào)用無(wú)能為力。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/81655.html
摘要:解決方案跨域問(wèn)題可以說(shuō)在前端方面不可避免,但同源策略畢竟在保護(hù)網(wǎng)絡(luò)信息安全方面起到很大的作用。 起因 說(shuō)起來(lái)源...今天去茶水間倒水時(shí),偶然聽(tīng)到公司面試官在問(wèn)面試者前端跨域的如何解決。我心中默默想了一想,啪啪啪瞬間想出幾個(gè)關(guān)鍵詞,iframe,cors,同源策略,jsonp...轉(zhuǎn)念一想,雖然這是很常見(jiàn)的面試題,然而我在開發(fā)過(guò)程中,還真沒(méi)有用過(guò)jsonp這種方式...就連原理也說(shuō)不好。...
摘要:用于告知瀏覽器可以將預(yù)先檢查請(qǐng)求返回結(jié)果緩存的時(shí)間,在緩存有效期內(nèi),瀏覽器會(huì)使用緩存的預(yù)先檢查結(jié)果判斷是否發(fā)送跨域請(qǐng)求。 跨域,老生常談的問(wèn)題 簡(jiǎn)述 作為一只前端菜鳥,跨域方面只懂得JSONP和CORS,并未曾深入了解。但隨著春招越來(lái)越近,就算是菜鳥也要猛振翅膀。近幾日仔細(xì)研究了跨域問(wèn)題,寫下這篇文章,希望對(duì)開發(fā)者們有所幫助。在讀本文前,希望您對(duì)以下知識(shí)略有了解。 瀏覽器同源策略 n...
摘要:瀏覽器同源策略我們?yōu)楹我芯靠缬騿?wèn)題因?yàn)闉g覽器的同源策略規(guī)定某域下的客戶端在沒(méi)明確授權(quán)的情況下,不能讀寫另一個(gè)域的資源。 跨域,老生常談的問(wèn)題 簡(jiǎn)述 作為一只前端菜鳥,跨域方面只懂得JSONP和CORS,并未曾深入了解。但隨著春招越來(lái)越近,就算是菜鳥也要猛振翅膀。近幾日仔細(xì)研究了跨域問(wèn)題,寫下這篇文章,希望對(duì)開發(fā)者們有所幫助。在讀本文前,希望您對(duì)以下知識(shí)略有了解。 瀏覽器同源策略 n...
摘要:瀏覽器在請(qǐng)求不同域的資源時(shí),會(huì)因?yàn)橥床呗缘挠绊懻?qǐng)求不成功,這就是通常被提到的跨域問(wèn)題。需要說(shuō)明的幾個(gè)點(diǎn)如果是協(xié)議和端口造成的跨域問(wèn)題,前端是無(wú)能為力的。 前段時(shí)間在網(wǎng)上跟一個(gè)大廠據(jù)說(shuō)很NB的同行大佬聊天,然后大佬問(wèn)了我一個(gè)問(wèn)題,在實(shí)際生產(chǎn)中前端怎么解決跨域問(wèn)題 我當(dāng)時(shí)就回答說(shuō)我們目前的狀況是需要服務(wù)端做一些配合解決的,然后大佬很不滿意的暗示了我一下JSONP用過(guò)嗎?我當(dāng)時(shí)就覺(jué)得很不可...
閱讀 3118·2021-11-15 18:14
閱讀 1773·2021-09-22 10:51
閱讀 3283·2021-09-09 09:34
閱讀 3505·2021-09-06 15:02
閱讀 1013·2021-09-01 11:40
閱讀 3186·2019-08-30 13:58
閱讀 2523·2019-08-30 11:04
閱讀 1081·2019-08-28 18:31