跨域

有以下幾個問題
  1. 什么是同源策略
  2. 什么是跨域压语?跨域有幾種實(shí)現(xiàn)形式
  3. JSONP 的原理是什么
  4. CORS是什么

我們先描述一個場景萨咕,小明是一個中國人谍憔,他想購買美國的商品跺撼,可是小明是用人民幣的病线,而美國是用美元的吓著,無法購買。怎么辦呢送挑,小明有以下幾種方法打到購買的目的:

  • 找代購
  • 建立中美自由貿(mào)易
  • 用黃金購買
  • 發(fā)布求購信息绑莺,等某個美國人主動聯(lián)系

這是一個瀏覽器跨域的比喻。

我們來回答開頭的4個問題惕耕。

1: 什么是同源策略

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

本域要同時滿足以下條件:

  • 同協(xié)議:如都是http或者h(yuǎn)ttps
  • 同域名:如都是http://jirengu.com/ahttp://jirengu.com/b
  • 同端口:如都是80端口

對應(yīng)上面場景里的情況就是,要使用同種貨幣才能購買挤安,比如小明可以在國內(nèi)用人民幣購買商品谚殊,因?yàn)閲鴥?nèi)是用人民幣交易的。

2: 什么是跨域蛤铜?跨域有幾種實(shí)現(xiàn)形式

跨域就是不同域下的接口交互嫩絮。(相當(dāng)于中國的小明想購買美國的商品。)

跨域的實(shí)現(xiàn)形式有

  • jsonp (相當(dāng)于找代購)
  • cors (相當(dāng)于建立中美自由貿(mào)易)
  • 降域 (相當(dāng)于用黃金購買)
  • postMessage (相當(dāng)于發(fā)布求購信息围肥,等某個美國人主動聯(lián)系)

3: JSONP 的原理是什么

Web頁面上調(diào)用js文件時不受跨域的影響(不僅如此剿干,我們還發(fā)現(xiàn)凡是擁有”src”這個屬性的標(biāo)簽都擁有跨域的能力,比如<script>穆刻、<img>置尔、<iframe>);

jsonp就是利用了<script src="xxxx"> </script>這個標(biāo)簽不受跨域影響氢伟。
(<script> 相當(dāng)于代購)

話不多說榜轿,直接上代碼解釋篮愉,看注釋:

前端代碼

<script>
  
  $('.change').addEventListener('click', function(){ //給元素綁定事件
    var script = document.createElement('script');  //點(diǎn)擊事件后,創(chuàng)造一個script元素
    script.src = 'http://127.0.0.1/getNews?callback=appendHtml'; 
        /*設(shè)置script元素的src屬性差导,?前面的是協(xié)議猪勇,域名设褐,接口。
          泣刹?后面是用戶傳遞的一個callback參數(shù)
        */
    document.head.appendChild(script);   //把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>

后端router.js

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

    var news = [
        "第11日前瞻:中國沖擊4金 博爾特再戰(zhàn)200米羽球",
        "正直播柴飚/洪煒出戰(zhàn) 男雙力爭會師決賽",
        "女排將死磕巴西助析!郎平安排男陪練模仿對方核心",
        "沒有中國選手和巨星的110米欄 我們還看嗎?",
        "中英上演奧運(yùn)金牌大戰(zhàn)",
        "博彩賠率挺中國奪回第二紐約時報:中國因?qū)κ址幎鴣G失的獎牌最多",
        "最“出柜”奧運(yù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;    //獲取callback參數(shù)內(nèi)的值
    if (cb) {
        res.send(cb + '(' + JSON.stringify(data) + ')');
        //如果callback參數(shù)的值存在外冀,就用它做函數(shù)名包裹數(shù)據(jù),再發(fā)送
    } else {
        res.send(data);
        //如果沒有callback參數(shù)掀泳,數(shù)據(jù)就直接發(fā)送
    }
})

jsonp就是獲取一段代碼雪隧,用js去執(zhí)行,
前端向后端發(fā)送一個參數(shù)员舵,后端用這個參數(shù)封裝數(shù)據(jù)脑沿,發(fā)回來,前端再執(zhí)行

jsonp需要前后端配合马僻,后端同意才能跨域庄拇,沒有安全問題

4: CORS是什么

CORS:全稱為 Cross Origin Resource Sharing,跨域資源共享韭邓,是一種 ajax 跨域請求資源的方式措近,支持現(xiàn)代瀏覽器,IE支持10以上女淑。

CORS的實(shí)現(xiàn)方式是瞭郑,在后端的響應(yīng)頭添加一個
Access-Control-Allow-Origin 屬性,屬性的值是允許的域名鸭你。它的好處是前端的請求就是ajax凰浮,不需要修改,只要后端開訪問權(quán)限即可苇本,很方便袜茧。

代碼實(shí)例

<!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>
</body>

</html>

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

    var news = [
        "第11日前瞻:中國沖擊4金 博爾特再戰(zhàn)200米羽球",
        "正直播柴飚/洪煒出戰(zhàn) 男雙力爭會師決賽",
        "女排將死磕巴西瓣窄!郎平安排男陪練模仿對方核心",
        "沒有中國選手和巨星的110米欄 我們還看嗎笛厦?",
        "中英上演奧運(yùn)金牌大戰(zhàn)",
        "博彩賠率挺中國奪回第二紐約時報:中國因?qū)κ址幎鴣G失的獎牌最多",
        "最“出柜”奧運(yù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", "*");
    /*后端如果允許訪問數(shù)據(jù)俺夕,就在響應(yīng)頭中添加一個參數(shù)Access-Control-Allow-Origin裳凸,
    后面的參數(shù)值為允許的域名贱鄙,這里 * 表示允許所有人訪問,如果只想允許個別人訪問姨谷,就單獨(dú)設(shè)置
    */
    res.send(data);
})

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逗宁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子梦湘,更是在濱河造成了極大的恐慌瞎颗,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捌议,死亡現(xiàn)場離奇詭異哼拔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)瓣颅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門倦逐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宫补,你說我怎么就攤上這事檬姥。” “怎么了粉怕?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵穿铆,是天一觀的道長。 經(jīng)常有香客問我斋荞,道長荞雏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任平酿,我火速辦了婚禮凤优,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蜈彼。我一直安慰自己筑辨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布幸逆。 她就那樣靜靜地躺著棍辕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪还绘。 梳的紋絲不亂的頭發(fā)上楚昭,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機(jī)與錄音拍顷,去河邊找鬼抚太。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的尿贫。 我是一名探鬼主播电媳,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼庆亡!你這毒婦竟也來了匾乓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤又谋,失蹤者是張志新(化名)和其女友劉穎拼缝,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搂根,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年铃辖,在試婚紗的時候發(fā)現(xiàn)自己被綠了剩愧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡娇斩,死狀恐怖仁卷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情犬第,我是刑警寧澤锦积,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站歉嗓,受9級特大地震影響丰介,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鉴分,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一哮幢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧志珍,春花似錦橙垢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至敛纲,卻和暖如春喂击,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背淤翔。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工惭等, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人办铡。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓辞做,卻偏偏與公主長得像琳要,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子秤茅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353

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

  • 前言:對于跨域請求稚补,很早之前就有去了解過,但因?yàn)橐恢标P(guān)注的都是服務(wù)器后端開發(fā)框喳,故也就僅僅停留在概念的理解上而沒有機(jī)...
    ken_ljq閱讀 89,759評論 6 128
  • 前段時間學(xué)習(xí)了AJAX课幕,已經(jīng)可以從后臺拿到JSON串∥蹇澹可是出現(xiàn)了問題乍惊,目前我發(fā)送的請求都是在同域下的請求,如果我想...
    大春春閱讀 1,055評論 2 13
  • 由于瀏覽器的同源策略保護(hù)機(jī)制放仗,瀏覽器不能執(zhí)行來自其他來源的腳本润绎。通過js在不同的域之間進(jìn)行數(shù)據(jù)傳輸或通信,比如用a...
    威少_吳閱讀 1,385評論 0 2
  • 1.等待:我愿化作蒲公英诞挨,隨風(fēng)飄蕩莉撇,飄落泥土之上,開始了新的人生惶傻。但我從來都沒有離開過棍郎,我依然在那里靜靜地等...
    我是白漾伊閱讀 651評論 0 2
  • 黑天鵝是我前段時間所看的一部精神類的影片,影片是以芭蕾舞為題材银室,展現(xiàn)一個人在追求完美的過程中涂佃,與過去自己的斗爭以及...
    初銜白閱讀 371評論 0 0