跨域的幾種解決方法

1螃征、jsonp

最常見的一種跨域方式靖榕,其背后原理就是利用了 script 標(biāo)簽不受同源策略的限制挚躯,在頁(yè)面中動(dòng)態(tài)插入了 script忍捡,script 標(biāo)簽的 src 屬性就是后端 api 接口的地址,并且以 get 的方式將前端回調(diào)處理函數(shù)名稱告訴后端竖幔,后端在響應(yīng)請(qǐng)求時(shí)會(huì)將回調(diào)返還廊酣,并且將數(shù)據(jù)以參數(shù)的形式傳遞回去。
前端:

// http://127.0.0.1:8888/jsonp.html
var script = document.createElement('script');
script.src = 'http://127.0.0.1:2333/jsonpHandler?callback=_callback';
document.body.appendChild(script);      //插入script標(biāo)簽
// 回調(diào)處理函數(shù) _callback
var _callback = function(obj) {
   for(key in obj) {
     console.log('key: ' + key +' value: ' + obj[key]);
    }
}

后端:

// http://127.0.0.1:2333/jsonpHandler
app.get('/jsonpHandler', (req, res) => {
  let callback = req.query.callback;
  let obj = {
    type: 'jsonp',
    name: 'weapon-x'
  };
  res.writeHead(200, {"Content-Type": "text/javascript"});
  res.end(callback + '(' + JSON.stringify(obj) + ')');
})

在 jsonp.html 中打開控制臺(tái)可以看到返回?cái)?shù)據(jù)的輸出:


image

2赏枚、CORS

Cross-Origin Resource Sharing(跨域資源共享)是一種允許當(dāng)前域(origin)的資源(比如html/js/web service)被其他域(origin)的腳本請(qǐng)求訪問(wèn)的機(jī)制亡驰。
當(dāng)使用 XMLHttpRequest 發(fā)送請(qǐng)求時(shí),瀏覽器如果發(fā)現(xiàn)違反了同源策略就會(huì)自動(dòng)加上一個(gè)請(qǐng)求頭 origin饿幅,后端在接受到請(qǐng)求后確定響應(yīng)后會(huì)在 Response Headers 中加入一個(gè)屬性 Access-Control-Allow-Origin凡辱,值就是發(fā)起請(qǐng)求的源地址(http://127.0.0.1:8888),瀏覽器得到響應(yīng)會(huì)進(jìn)行判斷 Access-Control-Allow-Origin 的值是否和當(dāng)前的地址相同栗恩,只有匹配成功后才進(jìn)行響應(yīng)處理透乾。
前端:

// http://127.0.0.1:8888/cors.html
var xhr = new XMLHttpRequest();
xhr.onload = function(data) {
  var _data = JSON.parse(data.target.responseText)
  for(key in _data) {
    console.log('key: ' + key + ' value: ' + _data[key]);
  }
};
xhr.open('POST','http://127.0.0.1:2333/cors',true);
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
xhr.send();

后端:

// http://127.0.0.1:2333/cors
app.post('/cors', (req, res) => {
  if(req.headers.origin) {
    res.writeHead(200, {
      "Content-Type": "text/html; charset=UTF-8",
      "Access-Control-Allow-Origin": 'http://127.0.0.1:8888'
    });
    let people = {
      type: 'cors',
      name: 'weapon-x'
    }
    res.end(JSON.stringify(people));
  }
})

可以在開發(fā)者工具里面看到請(qǐng)求的詳細(xì)信息,并且在控制臺(tái)也可以看到返回的數(shù)據(jù)輸出:


image

3磕秤、postmessage跨域

在 HTML5 中新增了 postMessage 方法乳乌,postMessage 可以實(shí)現(xiàn)跨文檔消息傳輸 Cross Document Messaging,IE8市咆,F(xiàn)irefox 3汉操,Opera 9,Chrome 3 和 Safari 4 都支持 postMessage蒙兰。
該方法可以通過(guò)綁定 window 的 message 事件來(lái)監(jiān)聽發(fā)送跨文檔消息傳輸內(nèi)容磷瘤。
使用 postMessage 實(shí)現(xiàn)跨域的話原理就類似于 jsonp芒篷,動(dòng)態(tài)插入 iframe標(biāo)簽,再?gòu)?iframe 里面拿回?cái)?shù)據(jù)
采缚,私認(rèn)為用作跨頁(yè)面通信更加適合

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末针炉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子扳抽,更是在濱河造成了極大的恐慌篡帕,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贸呢,死亡現(xiàn)場(chǎng)離奇詭異镰烧,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)贮尉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門拌滋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)朴沿,“玉大人猜谚,你說(shuō)我怎么就攤上這事《脑” “怎么了魏铅?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)坚芜。 經(jīng)常有香客問(wèn)我览芳,道長(zhǎng),這世上最難降的妖魔是什么鸿竖? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任沧竟,我火速辦了婚禮,結(jié)果婚禮上缚忧,老公的妹妹穿的比我還像新娘悟泵。我一直安慰自己,他們只是感情好闪水,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布糕非。 她就那樣靜靜地躺著,像睡著了一般球榆。 火紅的嫁衣襯著肌膚如雪朽肥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天持钉,我揣著相機(jī)與錄音衡招,去河邊找鬼。 笑死每强,一個(gè)胖子當(dāng)著我的面吹牛蚁吝,可吹牛的內(nèi)容都是我干的旱爆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼窘茁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼怀伦!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起山林,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤房待,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后驼抹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桑孩,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年框冀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了流椒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡明也,死狀恐怖宣虾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情温数,我是刑警寧澤绣硝,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站撑刺,受9級(jí)特大地震影響鹉胖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜够傍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一甫菠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧冕屯,春花似錦寂诱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至搞挣,卻和暖如春带迟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背囱桨。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工仓犬, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人舍肠。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓搀继,卻偏偏與公主長(zhǎng)得像窘面,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子叽躯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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

  • 瀏覽器出于安全方面的考慮财边,只允許與本域下的接口交互。不同源的客戶端腳本在沒(méi)有明確授權(quán)情況下点骑,不能讀寫對(duì)方的資源酣难。為...
    Ligod閱讀 628評(píng)論 0 0
  • 什么是跨域 跨域,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本黑滴。它是由瀏覽器的同源策略造成的憨募,是瀏覽器對(duì)JavaScript實(shí)...
    Yaoxue9閱讀 1,288評(píng)論 0 6
  • 什么是跨域 跨域,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本袁辈。它是由瀏覽器的同源策略造成的菜谣,是瀏覽器對(duì)JavaScript實(shí)...
    他方l閱讀 1,061評(píng)論 0 2
  • 什么是跨域 跨域,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本晚缩。它是由瀏覽器的同源策略造成的尾膊,是瀏覽器對(duì)JavaScript實(shí)...
    HeroXin閱讀 833評(píng)論 0 4
  • 1. 什么是跨域 跨域,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本橡羞。它是由瀏覽器的同源策略造成的眯停,是瀏覽器對(duì)JavaScri...
    cbw100閱讀 6,311評(píng)論 2 86