前端常用的實現(xiàn)跨域的方法

這里說的js跨域是指通過js在不同的域之間進行數(shù)據(jù)傳輸或通信驳规,比如用ajax向一個不同的域請求數(shù)據(jù),或者通過js獲取頁面中不同域的框架中(iframe)的數(shù)據(jù)。只要協(xié)議医男、域名砸狞、端口有任何一個不同昨登,都被當(dāng)作是不同的域趾代。
要解決跨域的問題,我們可以使用以下幾種方法:

一、通過jsonp跨域

在js中禽捆,我們直接用XMLHttpRequest請求不同域上的數(shù)據(jù)時笙什,是不可以的。但是胚想,在頁面上引入不同域上的js腳本文件卻是可以的琐凭,jsonp正是利用這個特性來實現(xiàn)的。
例如:

//html代碼:
<ul id="ct" class="news">
    <li>第11日前瞻:中國沖擊4金</li>
    <li>男雙力爭會師決賽</li>
    <li>女排死磕巴西隊</li>
  </ul>
  <a id="change" class="btn" href="#" >換一組</a>
  <script>
    document.querySelector('#change').addEventListener('click',function(){
      var script = document.createElement('script');
      script.src = 'http://b.zhuwei.com:8080/getNews?callback=appendHtml';
      document.head.appendChild(script);
      //document.head.removeChild(script);
    })
    function appendHtml(news){
      var html ='';
      for(var i=0;i<news.length;i++){
        html+='<li>'+news[i]+'</li>';
      }
      console.log(html);
      document.querySelector('#ct').innerHTML = html;
    }
  </script>



//router代碼:
 app.get('/getNews',function(req,res){
    var news = [
      "第11日前瞻:中國沖擊4金 博爾特再戰(zhàn)200米",
      "正直播男雙力爭會師決賽",
      "女排將死磕巴西隊",
      "沒有中國選手和110巨星的110米跨欄",
      "中英上演奧運金牌大戰(zhàn)",
      "博彩賠率挺中國奪回第二",
      "最“出柜”奧運统屈?同性之愛閃耀里約",
      "下跪拜謝與洪荒之力一樣 都是真情流露"
    ]
    var data = [];
    for(var i=0;i<3;i++){
      var index = parseInt(Math.random()*news.length);
      data.push(news[index]);
      news.splice(index,1);
    }
    var cb = req.query.callback;
    res.send(cb+'('+JSON.stringify(data)+')');
  })

在這個例子中愁憔,當(dāng)點擊按鈕時孽拷,動態(tài)的創(chuàng)建了一個<script></script>標(biāo)簽脓恕,然后指定該標(biāo)簽的srchttp://zhuwei.com:8080/getNews,之后對該地址的內(nèi)容作為參數(shù)執(zhí)行appendHtml函數(shù)。從而實現(xiàn)了點擊按鈕乃秀,隨機切換三條新聞?wù)故驹陧撁嬷械墓δ堋?br>

二肛著、CORS跨域

CORS全城是跨域資源共享,(Cross-Origin Resource Sharing)环形,是一種ajax跨域請求資源的方式策泣,支持現(xiàn)代瀏覽器,支持IE10及以上抬吟。實現(xiàn)方法:當(dāng)使用XMLHttpRequest發(fā)送請求時萨咕,瀏覽器發(fā)現(xiàn)該請求不符合同源策略,會給該請求加入一個響應(yīng)頭:Origin火本,后臺進行一系列處理危队,如果確定接受請求則在返回結(jié)果中加入一個響應(yīng)頭:Access-Control-Allow-Origin聪建;瀏覽器判斷該相應(yīng)頭中是否包含Origin的值,如果有則瀏覽器會有處理響應(yīng)茫陆,我們就可以拿到響應(yīng)的數(shù)據(jù)金麸,如果不包含,瀏覽器就直接駁回簿盅,這時我們無法拿到響應(yīng)數(shù)據(jù)挥下。

//html代碼:
<ul id="ct" class="news">
    <li>第11日前瞻:中國沖擊4金</li>
    <li>男雙力爭會師決賽</li>
    <li>女排死磕巴西隊</li>
  </ul>
  <a id="change" class="btn" href="#" >換一組</a>
  <script>
    document.querySelector('#change').addEventListener('click',function(){
      var xhr = new XMLHttpRequest();
      xhr.open('get','http://b.zhuwei.com:8080/getNews',true);
      xhr.send();
      xhr.onreadystatechange = function(){
        if(xhr.readyState === 4 && xhr.status === 200){
          appendHtml(JSON.parse(xhr.responseText))
        }
      }
      })
    function appendHtml(news){
      var html ='';
      for(var i=0;i<news.length;i++){
        html+='<li>'+news[i]+'</li>';
      }
      console.log(html);
      document.querySelector('#ct').innerHTML = html;
    }

  </script>


//router代碼:
  app.get('/getNews',function(req,res){

    var news = [
      "第11日前瞻:中國沖擊4金 博爾特再戰(zhàn)200米",
      "正直播男雙力爭會師決賽",
      "女排將死磕巴西隊",
      "沒有中國選手和110巨星的110米跨欄",
      "中英上演奧運金牌大戰(zhàn)",
      "博彩賠率挺中國奪回第二",
      "最“出柜”奧運?同性之愛閃耀里約",
      "下跪拜謝與洪荒之力一樣 都是真情流露"
    ]
    var data = [];
    for(var i=0;i<3;i++){
      var index = parseInt(Math.random()*news.length);
      data.push(news[index]);
      news.splice(index,1);
    }
   
    res.header("Access-Control-Allow-Origin","*");
    res.send(data);
  })

三桨醋、使用降域?qū)崿F(xiàn)跨域

原理:相同主域名不同子域名下的頁面棚瘟,可以設(shè)置 document.domain 讓它們同域
限制:
1.有其他頁面 window 對象的引用。
2.二級域名相同喜最。
3.協(xié)議相同偎蘸。
4.端口相同。
使用方法就是將符合上述條件頁面的 document.domain 設(shè)置為同樣的二級域名瞬内。這樣我們就可以使用其他頁面的 window 對象引用迷雪。

//a.zhuwei.com:8080/a.html代碼:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<style type="text/css">
  .ct{
    width: 910px;
    margin: auto;
  }
  .main{
    float: left;
    width: 450px;
    height: 300px;
    border: 1px solid #ccc;
  }
  .main input{
    margin: 20px;
    width: 200px;
  }
  .iframe{
    float: right;
  }
  iframe{
    width: 450px;
    height: 300px;
    border: 1px dashed #ccc;
  }

</style>
</head>
<body>
  <div class="ct">
    <h1>降域?qū)崿F(xiàn)跨域</h1>
    <div class="main">
      <input type="text" placeholder="http://a.zhuwei.com:8080/a.html"></input>
    </div>
    <iframe src="http://b.zhuwei.com:8080/b.html" frameborder="0"></iframe>
  </div>
  <script>
    //URL: http://a.jrg.com:8080/a.html
  document.querySelector('.main input').addEventListener('input', function(){
  console.log(this.value);
  window.frames[0].document.querySelector('input').value = this.value;
})
document.domain = "zhuwei.com"
  </script>
  
</body>
</html>


//b.zhuwei.com:8080/b.html代碼:
 <html>
<style>
  html,body{
    margin: 0;
  }
  input{
    margin: 20px;
    width: 200px;
  }
</style>

  <input id="input" type="text"  placeholder="http://b.zhuwei.com:8080/b.html">
<script>
// URL: http://b.jrg.com:8080/b.html
 
document.querySelector('#input').addEventListener('input', function(){
  window.parent.document.querySelector('input').value = this.value;
})
document.domain = 'zhuwei.com';
</script>
</html>

通過降域 完成了跨域使a.zhuwei.com:8080/a.html可以操作不同域名下的b.zhuwei.com:8080/b.html

四、postMessage實現(xiàn)跨域

postMessage()方法允許來自不同源的腳本采用異步方式進行有限的通信虫蝶,可以實現(xiàn)跨文本檔章咧、多窗口、跨域消息傳遞秉扑。

//a.zhuwei.com:8080/a.html代碼:
<body>
  <div class="ct">
    <h1>postmessage實現(xiàn)跨域</h1>
    <div class="main">
      <input type="text" placeholder="http://a.zhuwei.com:8080/a.html"></input>
    </div>
    <iframe src="http://b.zhuwei.com:8080/b.html" frameborder="0"></iframe>
  </div>
  <script>
    //URL: http://a.jrg.com:8080/a.html
  document.querySelector('.main input').addEventListener('input', function(){
  
  window.frames[0].postMessage(this.value,'*');
  console.log(this.value);
})
window.addEventListener('message',function(e){
  document.querySelector('.main input').value = e.data
  console.log(e.data)
})
  </script>
  
</body>
</html>


//b.zhuwei.com:8080/b.html代碼:
   <input id="input" type="text"  placeholder="http://b.zhuwei.com:8080/b.html">
<script>
// URL: http://b.jrg.com:8080/b.html
 
document.querySelector('#input').addEventListener('input', function(){
  window.parent.postMessage(this.value,'*');
})
window.addEventListener('message',function(e){
  document.querySelector('#input').value = e.data
  console.log(e.data)
})
</script>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末慧邮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子舟陆,更是在濱河造成了極大的恐慌误澳,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秦躯,死亡現(xiàn)場離奇詭異忆谓,居然都是意外死亡,警方通過查閱死者的電腦和手機踱承,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門倡缠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人茎活,你說我怎么就攤上這事昙沦。” “怎么了载荔?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵盾饮,是天一觀的道長。 經(jīng)常有香客問我,道長丘损,這世上最難降的妖魔是什么普办? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮徘钥,結(jié)果婚禮上衔蹲,老公的妹妹穿的比我還像新娘。我一直安慰自己呈础,他們只是感情好舆驶,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著而钞,像睡著了一般贞远。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上笨忌,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音俱病,去河邊找鬼官疲。 笑死,一個胖子當(dāng)著我的面吹牛亮隙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼掰派,長吁一口氣:“原來是場噩夢啊……” “哼怔毛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起促王,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤犀盟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蝇狼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阅畴,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年迅耘,在試婚紗的時候發(fā)現(xiàn)自己被綠了贱枣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡颤专,死狀恐怖纽哥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情栖秕,我是刑警寧澤春塌,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響摔笤,放射性物質(zhì)發(fā)生泄漏够滑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一吕世、第九天 我趴在偏房一處隱蔽的房頂上張望彰触。 院中可真熱鬧,春花似錦命辖、人聲如沸况毅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尔许。三九已至,卻和暖如春终娃,著一層夾襖步出監(jiān)牢的瞬間味廊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工棠耕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留余佛,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓窍荧,卻偏偏與公主長得像辉巡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蕊退,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

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

  • 什么是跨域郊楣? 2.) 資源嵌入:、瓤荔、净蚤、等dom標(biāo)簽,還有樣式中background:url()茉贡、@font-fac...
    電影里的夢i閱讀 2,372評論 0 5
  • 什么是同源策略塞栅? 同源策略是指,瀏覽器出于安全方面的考慮腔丧,只允許與本域下的接口交互放椰。不同源的客戶端腳本在沒有明確授...
    upup_dayday閱讀 256評論 0 0
  • 一、瀏覽器的同源策略 1.什么是同源愉粤? 所謂“同源”指的是”三個相同“砾医。相同的域名、端口和協(xié)議衣厘,這三個相同的話就視...
    徐國軍_plus閱讀 843評論 1 3
  • 當(dāng)想起為某人寫東西的時候如蚜,不要猶豫-可能就這一次压恒。 當(dāng)想和某人真情流露的時候不要不好意思,因為時間過往-不復(fù)返错邦。 ...
    在路上走著看天空閱讀 223評論 0 0
  • 作者:澹臺好好 江南探赫,有著云煙一般的名字,粉壁黛瓦撬呢,繡簾雕窗伦吠,石棧小橋,楊柳堆煙魂拦。初到江南毛仪,就深深被她的婉約打動....
    SOMCENT閱讀 743評論 0 0