進階13 跨域

題目1: 什么是同源策略

瀏覽器出于安全方面的考慮,只允許與本域下的接口交互怕膛。不同源的客戶端腳本在沒有明確授權(quán)的情況下爽航,不能讀寫對方的資源。

本域(同源)指的是

  • 同協(xié)議: 如:都是http或者h(yuǎn)ttps
  • 同域名:域名相同
  • 同端口:端口號相同

題目2: 什么是跨域剔桨?跨域有幾種實現(xiàn)形式

當(dāng)前JS所在的頁面的url和請求的地址的url不是同源,即跨域徙融,請求會被瀏覽器阻止

實現(xiàn)形式

  • JSONP

  • CORS

  • 降域
    當(dāng)這兩個域名都屬于同一個基礎(chǔ)域名(主域名一致洒缀,二級域名不一致),而且所用的協(xié)議類型欺冀、端口都一致的時候树绩,可以使用降域來實現(xiàn)跨域, 可以通過將document.domain改成一樣的來實現(xiàn)。
    主要用于操作頁面內(nèi)iframe

  • posemessage

題目3: JSONP 的原理是什么

html中script標(biāo)簽可以引入其他域下的js隐轩,比如引入線上的jquery庫饺饭。利用這個特性,可實現(xiàn)跨域訪問接口职车。需要后端支持

  1. 定義數(shù)據(jù)處理函數(shù)_fun
  2. 創(chuàng)建script標(biāo)簽瘫俊,script.src的地址: 后端接口鹊杖,且最后加個參數(shù)callback=_fun //方便后端獲取callback屬性以確定返回值
  3. 服務(wù)端在收到請求后,解析參數(shù)扛芽,計算返還數(shù)據(jù)骂蓖,輸出 fun(data) 字符串。
  4. fun(data)會放到script標(biāo)簽做為js執(zhí)行川尖。此時會調(diào)用fun函數(shù)登下,將data做為參數(shù)。

缺點:

  • 較復(fù)雜
  • 容易出現(xiàn)xss(cross site Scripting(跨站腳本攻擊))攻擊叮喳,因為從后臺拿到數(shù)據(jù)后直接放到j(luò)s里執(zhí)行被芳,存在潛在危險

題目4: CORS是什么

CORS 全稱是跨域資源共享(Cross-Origin Resource Sharing),是一種 ajax 跨域請求資源的方式馍悟,支持現(xiàn)代瀏覽器畔濒,IE支持10以上。
實現(xiàn)方式很簡單赋朦,當(dāng)你使用 XMLHttpRequest 發(fā)送請求時篓冲,瀏覽器發(fā)現(xiàn)該請求不符合同源策略,會給該請求加一個請求頭:Origin宠哄,后臺進行一系列處理,如果確定接受請求則在返回結(jié)果中加入一個響應(yīng)頭res.header("Access-Control-Allow-Origin","需要后端進行響應(yīng)的請求來源url嗤攻, *代表對所有url的請求做出響應(yīng)") 瀏覽器判斷該相應(yīng)頭中是否包含 Origin 的值毛嫉,如果有則瀏覽器會處理響應(yīng),我們就可以拿到響應(yīng)數(shù)據(jù)妇菱,如果不包含瀏覽器直接駁回承粤,這時我們無法拿到響應(yīng)數(shù)據(jù)。所以 CORS 的表象是讓你覺得它與同源的 ajax 請求沒啥區(qū)別闯团,代碼完全一樣辛臊,重點在于后端響應(yīng)增加響應(yīng)頭。

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

JSONP 跨域

前臺代碼

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>news</title>
<style>
  .container{
    width: 900px;
    margin: 0 auto;
  }
</style>
</head>
<body>
  <div class="container">
    <ul class="news">
      <li>第11日前瞻:中國沖擊4金 博爾特再戰(zhàn)</li>
      <li>男雙力爭會師決賽 </li> 
      <li>女排將死磕巴西彻舰!</li>
    </ul>
    <button class="change">換一組</button>
  </div>
  
<script>
  
  $('.change').addEventListener('click', function(){
    var script = document.createElement('script');
    script.src = 'http://127.0.0.1/getNews?callback=appendHtml';
    document.head.appendChild(script);  // 創(chuàng)建src標(biāo)簽,script.src的地址: 后端接口候味,且最后加個參數(shù)callback=數(shù)據(jù)處理函數(shù)
    document.head.removeChild(script);
  })
  function appendHtml(news){        // 定義數(shù)據(jù)處理函數(shù)
    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>

后端代碼

app.get('/getNews', function(req, res){

    var news = [
        "第11日前瞻:中國沖擊4金 博爾特再戰(zhàn)200米羽球",
        "正直播柴飚/洪煒出戰(zhàn) 男雙力爭會師決賽",
        "女排將死磕巴西刃唤!郎平安排男陪練模仿對方核心",
        "沒有中國選手和巨星的110米欄 我們還看嗎?",
        "中英上演奧運金牌大戰(zhàn)",
        "博彩賠率挺中國奪回第二紐約時報:中國因?qū)κ址幎鴣G失的獎牌最多",
        "最“出柜”奧運白群?同性之愛閃耀里約",
        "下跪拜謝與洪荒之力一樣 都是真情流露"
    ]
    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;
    if(cb){
        res.send(cb + '('+ JSON.stringify(data) + ')');  // 服務(wù)端在收到請求后尚胞,解析參數(shù),計算返還數(shù)據(jù)帜慢,返回 fun(data) 字符串笼裳。
    }else{
        res.send(data);
    }
})

CORS

CORS實現(xiàn)跨域與普通的ajax在前端代碼中并沒有區(qū)別唯卖,重點在于后臺返回數(shù)據(jù)時增加res.header

前臺代碼

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>news</title>
<style>
  .container{
    width: 900px;
    margin: 0 auto;
  }
</style>
</head>
<body>
  <div class="container">
    <ul class="news">
      <li>第11日前瞻:中國沖擊4金 博爾特再戰(zhàn)</li>
      <li>男雙力爭會師決賽 </li> 
      <li>女排將死磕巴西!</li>
    </ul>
    <button class="change">換一組</button>
  </div>
  
<script>
  
  $('.change').addEventListener('click', function(){
    var xhr = new XMLHttpRequest();
    xhr.open('get', 'http://b.jrg.com:8080/getNews', true);
    xhr.send();
    xhr.onreadystatechange = function(){
      if(xhr.readyState === 4 && xhr.status === 200){
        appendHtml( JSON.parse(xhr.responseText) )
      }
    }
    window.xhr = xhr
  })
  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>

后臺代碼

app.get('/getNews', function(req, res){

    var news = [
        "第11日前瞻:中國沖擊4金 博爾特再戰(zhàn)200米羽球",
        "正直播柴飚/洪煒出戰(zhàn) 男雙力爭會師決賽",
        "女排將死磕巴西躬柬!郎平安排男陪練模仿對方核心",
        "沒有中國選手和巨星的110米欄 我們還看嗎耐床?",
        "中英上演奧運金牌大戰(zhàn)",
        "博彩賠率挺中國奪回第二紐約時報:中國因?qū)κ址幎鴣G失的獎牌最多",
        "最“出柜”奧運?同性之愛閃耀里約",
        "下跪拜謝與洪荒之力一樣 都是真情流露"
    ]
    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", "http://a.jrg.com:8080");  // 增加發(fā)起跨域請求的URL的響應(yīng)頭
    //res.header("Access-Control-Allow-Origin", "*");           //  *表示接受所有URL發(fā)起的跨域請求并作出相應(yīng)
    res.send(data);
})

降域

當(dāng)這兩個域名都屬于同一個基礎(chǔ)域名(主域名一致楔脯,二級域名不一致)撩轰,而且所用的協(xié)議類型、端口都一致的時候昧廷,可以使用降域來實現(xiàn)跨域, 可以通過將document.domain改成一樣的來實現(xiàn)堪嫂。
主要用于操作頁面內(nèi)iframe

<html>
<style>
  .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>

<div class="ct">
  <h1>使用降域?qū)崿F(xiàn)跨域</h1>
  <div class="main">
    <input type="text" placeholder="http://a.jrg.com:8080/a.html">
  </div>

  <iframe src="http://b.jrg.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 = "jrg.com"
</script>
</html>
<html>
<style>
    html,body{
        margin: 0;
    }
    input{
        margin: 20px;
        width: 200px;
    }
</style>

    <input id="input" type="text"  placeholder="http://b.jrg.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 = 'jrg.com';
</script>
</html>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市木柬,隨后出現(xiàn)的幾起案子皆串,更是在濱河造成了極大的恐慌,老刑警劉巖眉枕,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恶复,死亡現(xiàn)場離奇詭異,居然都是意外死亡速挑,警方通過查閱死者的電腦和手機谤牡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姥宝,“玉大人翅萤,你說我怎么就攤上這事±奥” “怎么了套么?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長碳蛋。 經(jīng)常有香客問我胚泌,道長,這世上最難降的妖魔是什么肃弟? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任玷室,我火速辦了婚禮,結(jié)果婚禮上愕乎,老公的妹妹穿的比我還像新娘阵苇。我一直安慰自己,他們只是感情好感论,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布绅项。 她就那樣靜靜地躺著,像睡著了一般比肄。 火紅的嫁衣襯著肌膚如雪快耿。 梳的紋絲不亂的頭發(fā)上囊陡,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音掀亥,去河邊找鬼撞反。 笑死,一個胖子當(dāng)著我的面吹牛搪花,可吹牛的內(nèi)容都是我干的遏片。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼撮竿,長吁一口氣:“原來是場噩夢啊……” “哼吮便!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起幢踏,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤髓需,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后房蝉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體僚匆,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年搭幻,在試婚紗的時候發(fā)現(xiàn)自己被綠了咧擂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡粗卜,死狀恐怖屋确,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情续扔,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布焕数,位于F島的核電站纱昧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏堡赔。R本人自食惡果不足惜识脆,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望善已。 院中可真熱鬧灼捂,春花似錦、人聲如沸换团。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽艘包。三九已至的猛,卻和暖如春耀盗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卦尊。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工叛拷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人岂却。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓忿薇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親躏哩。 傳聞我的和親對象是個殘疾皇子署浩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

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

  • 題目1: 什么是同源策略 瀏覽器出于安全方面的考慮,只允許與本域下的接口交互震庭。不同源的客戶端腳本在沒有明確授權(quán)的情...
    饑人谷_星璇閱讀 136評論 0 0
  • 1.什么是同源策略瑰抵? 同源策略是指,瀏覽器出于安全方面的考慮器联,只允許與本域下的接口交互二汛。不同源的客戶端腳本在沒有明...
    upup_dayday閱讀 186評論 0 0
  • 什么是同源策略 同源策略(Same origin policy)是一種約定,它是瀏覽器最核心也最基本的安全功能拨拓,如...
    饑人谷_嚴(yán)琰閱讀 222評論 0 0
  • 什么是同源策略 一個源的定義如果協(xié)議肴颊,端口(如果指定了一個)和域名對于兩個頁面是相同的,則兩個頁面具有相同的源渣磷。同...
    Maaaax閱讀 134評論 0 0
  • 今天早上沒下雨婿着,一邊跑步一邊聽姚老師在學(xué)乎網(wǎng)空中讀書會娓娓動聽的金剛智慧的解讀,感恩姚老師的講課醋界,感恩好友回老家親...
    順路99閱讀 136評論 0 1