跨域

什么是同源策略

同源策略(same origin policy),1995年同源政策由 Netscape 公司引入瀏覽器渴庆。目前,所有瀏覽器都實行這個政策瀏覽器出于安全方面的考慮,只允許與本域下的接口進行交互。不同源的客戶腳本在沒有明確授權的情況下诫龙,不能讀取對方的資源。
同源政策的目的鲫咽,是為了保證用戶信息的安全签赃,防止惡意的網(wǎng)站竊取數(shù)據(jù)

本域指的是

  • 同協(xié)議:比如都是 http 或者 https
  • 同端口:比如都是 80 端口
  • 同域名:比如都是 google.com

什么是跨域?跨域有幾種實現(xiàn)形式

跨域是指通過一定方式繞過瀏覽器同源政策的限制分尸,可以與不同域進行交互
目前學習到四種實現(xiàn)形式:

  • JSONP
  • CORS
  • 降域
  • postMessage

JSONP 的原理是什么

jsonp 是一種跨域通信的手段锦聊,它的原理其實很簡單:

  1. 首先是利用 script 標簽的 src 屬性來實現(xiàn)跨域。
  2. 通過將前端方法作為參數(shù)傳遞到服務器端箩绍,然后由服務器端注入?yún)?shù)之后再返回孔庭,實現(xiàn)服務器端向客戶端通信。
  3. 由于使用 script 標簽的 src 屬性材蛛,因此只支持 get 方法

CORS是什么

  • CORS 是一個 W3C 標準圆到,全稱是“跨域資源共享”(Cross-origin resource sharing,它允許瀏覽器向跨源服務器仰税,發(fā)出 XMLHttpRequest 請求构资,從而克服了 AJAX 只能同源使用的限制

  • CORS 需要瀏覽器和服務器同時支持抽诉。目前陨簇,所有瀏覽器都支持該功能,IE瀏覽器不能低于 IE10迹淌。

  • 整個 CORS 通信過程河绽,都是瀏覽器自動完成,不需要用戶參與唉窃。對于開發(fā)者來說耙饰,CORS 通信與同源的 AJAX 通信沒有差別,代碼完全一樣纹份。瀏覽器一旦發(fā)現(xiàn) AJAX 請求跨源苟跪,就會自動添加一些附加的頭信息廷痘,有時還會多出一次附加的請求,但用戶不會有感覺件已。

因此笋额,實現(xiàn) CORS 通信的關鍵是服務器。只要服務器實現(xiàn)了 CORS 接口篷扩,就可以跨源通信兄猩。

參考阮一峰

根據(jù)視頻里的講解演示三種以上跨域的解決方式 ,寫成博客

  • JSONP
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) 男雙力爭會師決賽",
        "女排將死磕巴西鉴未!郎平安排男陪練模仿對方核心"
        ]
      res.setHeader('Content-Type','text/json; charset=utf-8')
      if(pathObj.query.callback){
        res.end(pathObj.query.callback + '(' + JSON.stringify(news) + ')')  // 將數(shù)據(jù)處理后返回
      }else{
        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)
<!DOCTYPE html>
<html>
<body>
  <div class="container">
    <ul class="news">
    </ul>
    <button class="show">show news</button>
  </div>

<script>
   // 通過script標簽發(fā)送請求
  $('.show').addEventListener('click', function(){
    var script = document.createElement('script');
    script.src = 'http://127.0.0.1:8080/getNews?callback=appendHtml';
    document.head.appendChild(script);
    document.head.removeChild(script);
  })

   // 將獲取到的數(shù)據(jù)添加到頁面中
  function appendHtml(news){
    var html = '';
    for( var i=0; i<news.length; i++){
      html += '<li>' + news[i] + '</li>';
    }
    console.log(html);
    $('.news').innerHTML = html;
  }

  function $(id){
    return document.querySelector(id);
  }
</script>

</html>
  • CORS
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) 男雙力爭會師決賽",
        "女排將死磕巴西枢冤!郎平安排男陪練模仿對方核心"
        ]
      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)
<!DOCTYPE html>
<html>
<body>
  <div class="container">
    <ul class="news">
    </ul>
    <button class="show">show news</button>
  </div>

<script>

  $('.show').addEventListener('click', function(){
    xhr = new XMLHttpRequest();  // 創(chuàng)建 AJAX 請求
    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>';
    }
    console.log(html);
    $('.news').innerHTML = html;
  }

  function $(id){
    return document.querySelector(id);
  }
</script>

</html>
  • postMessage
    postMessage 是 HTML5 新增加的一項功能铜秆,跨文檔消息傳輸(Cross Document Messaging)淹真,目前:Chrome 2.0+、Internet Explorer 8.0+, Firefox 3.0+, Opera 9.6+, 和 Safari 4.0+ 都支持這項功能连茧,使用起來也特別簡單
    • 首先創(chuàng)建 a.html

      <!DOCTYPE html>
      <html>
      <head>
        <meta charset="UTF-8">
        <title>postMessage</title>
      </head>
      <body>
        <iframe src="http://localhost:8080/b.html" ></iframe>
        <script>
          window.onload = function(){
            var targetOrigin = "http://localhost:8080";
            window.frames[0].postMessage('看到我發(fā)給你的信息沒', targetOrigin);
          }
          window.addEventListener('message',function(e){
            console.log('a.html接收到信息:',e.data);
          });
        </script>
      </body>
      </html>
      
    • 創(chuàng)建 b.html

      <!DOCTYPE html>
      <html>
      <head>
        <meta charset="UTF-8">
        <title>postMessageB</title>
      </head>
      <body>
        
        <script>
          window.addEventListener('message',function(e){
            if(e.source != window.parent){
              return
            }
            var data = e.data;
            console.log("b.html接收到的消息", data);
            parent.postMessage("我看到你發(fā)的消息了", e.origin)
          })
        </script>
      </body>
      </html>
      

在瀏覽器中打開 http://localhos/a.html

postMessage.png

跨域成功
參考:MDN

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末趟咆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子梅屉,更是在濱河造成了極大的恐慌值纱,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坯汤,死亡現(xiàn)場離奇詭異虐唠,居然都是意外死亡,警方通過查閱死者的電腦和手機惰聂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門疆偿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搓幌,你說我怎么就攤上這事杆故。” “怎么了溉愁?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵处铛,是天一觀的道長。 經(jīng)常有香客問我拐揭,道長撤蟆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任堂污,我火速辦了婚禮家肯,結果婚禮上,老公的妹妹穿的比我還像新娘盟猖。我一直安慰自己讨衣,他們只是感情好换棚,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪镊逝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天颇蜡,我揣著相機與錄音,去河邊找鬼辆亏。 笑死风秤,一個胖子當著我的面吹牛,可吹牛的內容都是我干的扮叨。 我是一名探鬼主播缤弦,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼彻磁!你這毒婦竟也來了碍沐?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤衷蜓,失蹤者是張志新(化名)和其女友劉穎累提,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體磁浇,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡斋陪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了置吓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片无虚。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖衍锚,靈堂內的尸體忽然破棺而出友题,到底是詐尸還是另有隱情,我是刑警寧澤戴质,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布度宦,位于F島的核電站,受9級特大地震影響置森,放射性物質發(fā)生泄漏斗埂。R本人自食惡果不足惜符糊,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一凫海、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧男娄,春花似錦行贪、人聲如沸漾稀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽崭捍。三九已至,卻和暖如春啰脚,著一層夾襖步出監(jiān)牢的瞬間殷蛇,已是汗流浹背。 一陣腳步聲響...
  • 我被黑心中介騙來泰國打工橄浓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留粒梦,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓荸实,卻偏偏與公主長得像匀们,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子准给,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內容

  • 題目1.什么是同源策略? 同源策略(Same origin Policy): 瀏覽器出于安全方面的考慮泄朴,只允許與本...
    FLYSASA閱讀 1,721評論 0 6
  • 1. 什么是跨域? 跨域一詞從字面意思看露氮,就是跨域名嘛祖灰,但實際上跨域的范圍絕對不止那么狹隘。具體概念如下:只要協(xié)議...
    w_zhuan閱讀 518評論 0 0
  • 1. 什么是跨域畔规? 跨域一詞從字面意思看夫植,就是跨域名嘛,但實際上跨域的范圍絕對不止那么狹隘油讯。具體概念如下:只要協(xié)議...
    他在發(fā)呆閱讀 822評論 0 0
  • 給大家推薦這首歌详民。 大部分的原因是, 送給所有在清明節(jié)不能回家的朋友陌兑。 歌詞 夜色茫茫 罩四周 天邊新月如鉤 回憶...
    大胡子豬閱讀 373評論 0 2
  • 不知不覺間,那個老師被調離了软驰! 文 / 錢黎潔 咱孩子班級下學期鐵定換語文老師了涧窒!那天一起在校門外等孩子,一洋同班...
    錢錢show生活閱讀 348評論 0 0