跨域及實(shí)現(xiàn)的幾種方式

一钉嘹、 跨域的概念

  • 同源策略(Same origin Policy):
    同源策略是指瀏覽器處于安全考慮,只允許與本域下的接口進(jìn)行交互娃属,不同源的客戶端腳本在沒有明確授權(quán)的情況下爆存,不能讀寫對方的資源蛉顽。

  • 同源(本域)的概念:
    同協(xié)議:都是為http或者h(yuǎn)ttps;
    同域名:http://a.com/index.htmlhttp://a.com/server.js 域名一致先较;
    同端口:端口號一致(如都為8080)蜂林。

  • 跨域就是因?yàn)闉g覽器的同源策略機(jī)制存在而產(chǎn)生的遥诉,跨域的幾種形式:

  1. http://www.abc.com/index.html 調(diào)用 http://www.abc.com/server.php
    (同源,非跨域噪叙,協(xié)議矮锈、域名及端口號都一致)
  2. http://www.abc.com/index.html 調(diào)用 http://www.def.com/server.php
    (主域名不同,跨域)
  3. http://abc.a.com/index.html 調(diào)用 http://def.a.com/server.php
    (子域名不同:abc/def睁蕾,跨域)
  4. http://www.abc.com:8080/index.html 調(diào)用 http://www.abc.com:8081/server.php
    (端口不同苞笨,跨域)
  5. http://www.abc.com/index.html 調(diào)用 https://www.abc.com/server.php
    (協(xié)議不同:http/https,跨域)

需要注意的是:對于當(dāng)前頁面來說頁面存放的 JS 文件的域不重要子眶,重要的是加載該 JS 頁面所在什么域瀑凝。

二、跨域的四種實(shí)現(xiàn)形式

1. JSONP
  • JSONP(JSON with padding)原理:
    利用html里面script標(biāo)簽可以加載其他域下的js這一特性臭杰,使用script src的形式來獲取其他域下的數(shù)據(jù)粤咪,但是因?yàn)槭峭ㄟ^標(biāo)簽引入的,所以會(huì)將請求到的JSON格式的數(shù)據(jù)作為js去運(yùn)行處理渴杆,顯然這樣運(yùn)行是不行的寥枝,所以就需要提前將返回的數(shù)據(jù)包裝一下,封裝成函數(shù)進(jìn)行運(yùn)行處理磁奖,函數(shù)名通過接口傳參的方式傳給后臺(tái)囊拜,后臺(tái)解析到函數(shù)名后在原始數(shù)據(jù)上「包裹」這個(gè)函數(shù)名,發(fā)送給前端比搭。(JSONP 需要對應(yīng)接口的后端的配合才能實(shí)現(xiàn))

  • 實(shí)例:

<script>
function showData(ret){
console.log(ret);
}
</script>
<script src="http://api.jirengu.com/weather.php?callback=showData"></script>

當(dāng)script src請求到達(dá)后端后冠跷,后端會(huì)去解析callback這個(gè)參數(shù)獲取到字符串showData,在發(fā)送數(shù)據(jù)后端返回?cái)?shù)據(jù)用showData封裝一下身诺,即 showData({"json數(shù)據(jù)"}) 蜜托,前端script標(biāo)簽在加載數(shù)據(jù)后會(huì)把json數(shù)據(jù)作為showData的參數(shù),調(diào)用函數(shù)運(yùn)行霉赡。

2. CORS
  • CORS 的概念:
    CORS全稱是跨域資源共享(Cross-Origin Resource Sharing)橄务,是一種 ajax 跨域請求資源的方式,支持現(xiàn)代瀏覽器同廉,IE支持10以上。

  • 實(shí)現(xiàn)方式:
    當(dāng)使用 XMLHttpRequest 發(fā)送請求時(shí)柑司,瀏覽器發(fā)現(xiàn)該請求不符合同源策略迫肖,會(huì)給該請求加一個(gè)請求頭:Origin,后臺(tái)進(jìn)行一系列處理攒驰,如果確定接受請求則在返回結(jié)果中加入一個(gè)響應(yīng)頭:Access-Control-Allow-Origin; 瀏覽器判斷該相應(yīng)頭中是否包含 Origin 的值蟆湖,如果有則瀏覽器會(huì)處理響應(yīng),我們就可以拿到響應(yīng)數(shù)據(jù)玻粪,如果不包含瀏覽器直接駁回隅津,這時(shí)我們無法拿到響應(yīng)數(shù)據(jù)诬垂。

  • 實(shí)例:

server.js

var http = require('http')
var fs = require('fs')
var path = require('path')
var url = require('url')

http.createServer(function(req, res){
  var pathObj = url.parse(req.url, true)

  switch (pathObj.pathname) {
    case '/getNews':
      var news = [
        "第11日前瞻:中國沖擊4金 博爾特再戰(zhàn)200米羽球",
        "正直播柴飚/洪煒出戰(zhàn) 男雙力爭會(huì)師決賽",
        "女排將死磕巴西!郎平安排男陪練模仿對方核心"
        ]

      res.setHeader('Access-Control-Allow-Origin','http://localhost:8080')
      //res.setHeader('Access-Control-Allow-Origin','*')
      res.end(JSON.stringify(news))
      break;
    default:
      fs.readFile(path.join(__dirname, pathObj.pathname), function(e, data){
        if(e){
          res.writeHead(404, 'not found')
          res.end('<h1>404 Not Found</h1>')
        }else{
          res.end(data)
        }
      }) 
  }
}).listen(8080)

index.html

<!DOCTYPE html>
<html>
<body>
  <div class="container">
    <ul class="news"></ul>
    <button class="show">show news</button>
  </div>

<script>
  $('.show').addEventListener('click', function(){
    var xhr = new XMLHttpRequest()
    xhr.open('GET', 'http://127.0.0.1:8080/getNews', true)
    xhr.send()
    xhr.onload = function(){
      appendHtml(JSON.parse(xhr.responseText))
    }
  })
  function appendHtml(news){
    var html = ''
    for( var i=0; i<news.length; i++){
      html += '<li>' + news[i] + '</li>'
    }
    $('.news').innerHTML = html
  }
  function $(selector){
    return document.querySelector(selector)
  }
</script>
</html>
3. 降域(前提主域名要一致)

http://a.yilia.com 調(diào)用http://b.yilia.com

<script>
  document.domain = yilia.com伦仍;
</script>
//將兩個(gè)域名都降域结窘,此時(shí)就可以相互訪問了
4. postMessage

假設(shè)有兩個(gè)域名(主域域名不一致),其中iframe頁面是允許訪問調(diào)用充蓝,那么就可以用postMessage實(shí)現(xiàn)隧枫。
原理:
a域名發(fā)送請求postMessage,b域名間聽到了message事件谓苟,就處理并返回?cái)?shù)據(jù)

//b域名
<script>
window.frames[0].postMessage(this.value, '*');
//*號表示在任何域下都可以接收message
window.addEventListener('message', function(e){
  console.log(e.data);
})官脓;
</script>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市涝焙,隨后出現(xiàn)的幾起案子卑笨,更是在濱河造成了極大的恐慌,老刑警劉巖仑撞,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赤兴,死亡現(xiàn)場離奇詭異,居然都是意外死亡派草,警方通過查閱死者的電腦和手機(jī)搀缠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來近迁,“玉大人艺普,你說我怎么就攤上這事〖撸” “怎么了歧譬?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長搏存。 經(jīng)常有香客問我瑰步,道長,這世上最難降的妖魔是什么璧眠? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任缩焦,我火速辦了婚禮,結(jié)果婚禮上责静,老公的妹妹穿的比我還像新娘袁滥。我一直安慰自己,他們只是感情好灾螃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布题翻。 她就那樣靜靜地躺著,像睡著了一般腰鬼。 火紅的嫁衣襯著肌膚如雪嵌赠。 梳的紋絲不亂的頭發(fā)上塑荒,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機(jī)與錄音姜挺,去河邊找鬼齿税。 笑死,一個(gè)胖子當(dāng)著我的面吹牛初家,可吹牛的內(nèi)容都是我干的偎窘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼溜在,長吁一口氣:“原來是場噩夢啊……” “哼陌知!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起掖肋,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤仆葡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后志笼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沿盅,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年纫溃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腰涧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡紊浩,死狀恐怖窖铡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情坊谁,我是刑警寧澤费彼,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站口芍,受9級特大地震影響箍铲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鬓椭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一颠猴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧小染,春花似錦翘瓮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脱货。三九已至岛都,卻和暖如春律姨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背臼疫。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工择份, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烫堤。 一個(gè)月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓荣赶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鸽斟。 傳聞我的和親對象是個(gè)殘疾皇子拔创,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評論 2 355

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

  • 一、什么是跨域富蓄? 1.同源策略及其限制內(nèi)容 同源策略是一種約定剩燥,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源...
  • 什么是跨域 跨域立倍,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本灭红。它是由瀏覽器的同源策略造成的,是瀏覽器對JavaScript實(shí)...
    他方l閱讀 1,064評論 0 2
  • 什么是跨域 跨域口注,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本变擒。它是由瀏覽器的同源策略造成的,是瀏覽器對JavaScript實(shí)...
    Yaoxue9閱讀 1,301評論 0 6
  • 什么是跨域 跨域寝志,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本娇斑。它是由瀏覽器的同源策略造成的,是瀏覽器對JavaScript實(shí)...
    HeroXin閱讀 836評論 0 4
  • 題目1.什么是同源策略? 同源策略(Same origin Policy): 瀏覽器出于安全方面的考慮澈段,只允許與本...
    FLYSASA閱讀 1,724評論 0 6