關(guān)于跨域的一點(diǎn)研究

跨域是什么

  • 跨域,指的是當(dāng)一個(gè)資源向另一個(gè)與該資源本身所在服務(wù)器不同域或端口的服務(wù)器請(qǐng)求一個(gè)資源時(shí)席爽,資源會(huì)發(fā)起一個(gè)跨域HTTP 請(qǐng)求。例如:站點(diǎn) http://a.com中的某個(gè)圖片的 src 地址為 http://b.com 時(shí),就是發(fā)起了一次跨域http請(qǐng)求卵惦。
  • 出于安全考慮,瀏覽器會(huì)對(duì)ajax的跨域請(qǐng)求進(jìn)行限制瓦戚,其具體表現(xiàn)為瀏覽器會(huì)攔截跨域請(qǐng)求返回的內(nèi)容沮尿。而其他的標(biāo)簽如 scriptlink较解、img 等發(fā)送的跨域請(qǐng)求則會(huì)正常返回內(nèi)容畜疾。

同源策略是什么

  • 同源策略,指的是一種限制一個(gè)源的資源與來(lái)自另一個(gè)源的資源進(jìn)行交互的策略哨坪,這是一個(gè)用于隔離潛在惡意文件的關(guān)鍵的安全機(jī)制庸疾。
  • 這個(gè)策略具體指的是要在同協(xié)議、同域名当编、同端口的前提下届慈,才能夠進(jìn)行資源請(qǐng)求
  • 遵守這個(gè)策略的有 XMLHttpRequestFetch

有哪些跨域的解決方法

  • JSONP徒溪。JSONP的原理是利用 script 標(biāo)簽不受同源策略的限制,這種做法需要前端和后端的配合金顿。例子如下:
// btn為某個(gè)按鈕
btn.addEventListener('click', function () {
  var script = document.creatElement('div');
  script.src = 'www.xxx.com?callback=' + handle;
  document.head.appendChild(script);
  document.head.removeChild(script);
});

// handle為自定義的函數(shù)
function handle(data){}

在上面的例子中臊泌,先創(chuàng)造一個(gè) script 標(biāo)簽,然后把 src 賦值為后端的地址再加上 ?callback=handle揍拆,其中 handle 為自定義的函數(shù)的名字渠概,再利用 script 標(biāo)簽向目標(biāo)發(fā)送跨域請(qǐng)求。目標(biāo)接收到請(qǐng)求后嫂拴,解析里面的 callback 參數(shù)播揪,然后返回函數(shù)包含數(shù)據(jù)的格式,例如 res.send(callback+'('+JSON.stringify(data)+')') // data為要返回的數(shù)據(jù)筒狠。等到腳本加載完畢后猪狈,handle 函數(shù)就會(huì)自動(dòng)執(zhí)行,從而能夠處理跨域請(qǐng)求的數(shù)據(jù)

  • CORS辩恼」兔恚跨域資源共享(CORS)機(jī)制允許 Web 應(yīng)用服務(wù)器進(jìn)行跨域訪問(wèn)控制,從而使跨域數(shù)據(jù)傳輸?shù)靡园踩M(jìn)行灶伊。使用該機(jī)制的是 XMLHttpRequestFetch疆前,突破了ajax同源策略的限制。使用這個(gè)機(jī)制也需要后端的配合聘萨。例子如下:
btn.addEventListener('click', function () {
 var xhr = new XMLHttpRequest();
 xhr.onreadystatechange = handle;
 xhr.open('get', 'www.xxxx.com?aaa=1', true);
 xhr.send();
});

上面的例子與普通ajax的請(qǐng)求代碼沒(méi)什么不同竹椒,然而這樣通過(guò)ajax發(fā)起跨域請(qǐng)求所返回的數(shù)據(jù)則會(huì)被瀏覽器攔截。這個(gè)時(shí)候需要讓后端返回?cái)?shù)據(jù)之前要設(shè)置一個(gè)返回頭匈挖,如 res.setHeader('Access-Control-Allow-Origin', '*') // 第二個(gè)參數(shù)為允許訪問(wèn)的域名碾牌,*表示允許所有域名。當(dāng)瀏覽器讀取到數(shù)據(jù)的返回頭時(shí)儡循,如果返回頭的 Access-Control-Allow-Origin 字段后面的域名和發(fā)起請(qǐng)求的域名一樣舶吗,那么瀏覽器就不會(huì)攔截返回的數(shù)據(jù)。通過(guò)這種后端限制域名的方式择膝,可以使跨域數(shù)據(jù)傳輸更安全

  • 降域誓琼。對(duì)于主域相同而子域不相同的情況,可以使用降域的操作肴捉。例如有 http://a.ccc.comhttp://b.ccc.com 兩個(gè)網(wǎng)站腹侣,而且在 http://a.ccc.com 上通過(guò) iframe 引入 http://b.ccc.com,這時(shí)候如果想在a網(wǎng)站的腳本上操控b網(wǎng)站上的元素(跨域操作)齿穗,那么可以給兩個(gè)網(wǎng)站的腳本都設(shè)置 document.domain = 'ccc.com' // domain的值為主域名傲隶,這樣a網(wǎng)站就可以跨域操控b網(wǎng)站上的元素了

  • postMessage。HTML5增加了postMessage方法窃页,用于跨域傳輸信息跺株。例如 http://www.a.comiframe 里的 http://www.b.com 發(fā)送消息:

// http://www.a.com
<iframe src="http://www.b.com" frameborder="0"></iframe>
<script>
  window.iframes[0].onload = function () {
    window.iframes[0].postMessage('hello', '*'); // 第二個(gè)參數(shù)為目標(biāo)的URI地址复濒,如果窗口地址與第二個(gè)參數(shù)的URI不匹配,則不會(huì)發(fā)送消息
  }
</script>
// http://www.b.com
window.addEventListener('message', function (e) {
  console.log(e.data);
});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末乒省,一起剝皮案震驚了整個(gè)濱河市巧颈,隨后出現(xiàn)的幾起案子久妆,更是在濱河造成了極大的恐慌卿城,老刑警劉巖越走,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件征绸,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡拴竹,警方通過(guò)查閱死者的電腦和手機(jī)扫俺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門路鹰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)惨篱,“玉大人垒迂,你說(shuō)我怎么就攤上這事《噬撸” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵楷拳,是天一觀的道長(zhǎng)绣夺。 經(jīng)常有香客問(wèn)我,道長(zhǎng)欢揖,這世上最難降的妖魔是什么陶耍? 我笑而不...
    開(kāi)封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮她混,結(jié)果婚禮上烈钞,老公的妹妹穿的比我還像新娘。我一直安慰自己坤按,他們只是感情好毯欣,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著臭脓,像睡著了一般酗钞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上来累,一...
    開(kāi)封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天砚作,我揣著相機(jī)與錄音,去河邊找鬼嘹锁。 笑死葫录,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的领猾。 我是一名探鬼主播米同,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼骇扇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了窍霞?” 一聲冷哼從身側(cè)響起匠题,我...
    開(kāi)封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎但金,沒(méi)想到半個(gè)月后韭山,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡冷溃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年钱磅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片似枕。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盖淡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凿歼,到底是詐尸還是另有隱情褪迟,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布答憔,位于F島的核電站味赃,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏虐拓。R本人自食惡果不足惜心俗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蓉驹。 院中可真熱鬧城榛,春花似錦、人聲如沸态兴。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瞻润。三九已至工坊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間敢订,已是汗流浹背王污。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留楚午,地道東北人昭齐。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像矾柜,于是被迫代替她去往敵國(guó)和親阱驾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子就谜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)里覆,斷路器丧荐,智...
    卡卡羅2017閱讀 134,638評(píng)論 18 139
  • 什么是跨域? 2.) 資源嵌入:喧枷、虹统、、等dom標(biāo)簽隧甚,還有樣式中background:url()车荔、@font-fac...
    電影里的夢(mèng)i閱讀 2,368評(píng)論 0 5
  • 前言:對(duì)于跨域請(qǐng)求,很早之前就有去了解過(guò)戚扳,但因?yàn)橐恢标P(guān)注的都是服務(wù)器后端開(kāi)發(fā)忧便,故也就僅僅停留在概念的理解上而沒(méi)有機(jī)...
    ken_ljq閱讀 89,743評(píng)論 6 128
  • 魔都上海一直是我又愛(ài)又恨的地方,愛(ài)有愛(ài)的理帽借,恨有恨的據(jù)珠增。 一、第一份工作 在這里我尋到了第一份工作砍艾,從此走上獨(dú)立自...
    心如玉閱讀 233評(píng)論 0 0