什么是跨域寿弱?如何請求跨域犯眠?(二)

第一篇文章寫了關(guān)于跨域最常用的三種方法,即JSONP症革、cors筐咧、服務(wù)器代理,那么今天我們繼續(xù)講解另外三種根據(jù)iframe框架來實(shí)現(xiàn)的跨域請求方式。

location.hash

1.1問題描述

本地頁面a1.html要訪問異域a2.html的數(shù)據(jù)

1.2環(huán)境配置

a1.html 和 a3.html我們放在express中的app.js運(yùn)行
地址分別為:http://localhost:3000/a1.htmlhttp://localhost:3000/a3.html
a2.html 的代碼量蕊,我放在http://localhost:3001/a2.html

1.3原理

a1.html通過iframe跨域加載了a2.html的頁面铺罢,如果a1有hash,那么a2獲取數(shù)據(jù)危融,但是因?yàn)閍1和a2不同源畏铆,且a2iframe是a1的子頁面,所以a1無法從a2身上拿到任何數(shù)據(jù)吉殃;解決辦法是辞居,a2把數(shù)據(jù)通過hash和iframe傳給a3;a3和a1同源蛋勺,就可以把數(shù)據(jù)傳給a1的hash了

  • a1.html頁面的前端設(shè)置
    <script>
        let ifr=document.createElement('iframe');
        ifr.src='http://localhost:3001/a2.html#data';
        document.body.appendChild(ifr);
        ifr.style.display='none';
        window.addEventListener('hashchange',e=>{
            let data=location.hash.substring(1);
            console.log(data)
        })
    </script>
  • 異域a2.html頁面的前端設(shè)置
    <script>
        switch(location.hash){
            case '#data':
            callback();
            break;
        }
        function callback() {
            let data = '數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)'
            try {
                window.parent.location.hash = '#' + data;
            }
            catch(e){
                let ifr = document.createElement('iframe');
                ifr.src = 'http://localhost:3000/a3#' + data;
                document.body.appendChild(ifr);
                ifr.style.display='none';
            }
        }
    </script>
  • 同域a3.html的前端設(shè)置
    <script>
        window.parent.parent.hash=self.location.hash;
    </script>

window.name

window對象有個name屬性瓦灶,該屬性有個特征:即在一個窗口(window)的生命周期內(nèi),窗口載入的所有的頁面都是共享一個window.name的,每個頁面對window.name都有讀寫的權(quán)限抱完,window.name是持久存在一個窗口載入過的所有頁面中的贼陶,并不會因新頁面的載入而進(jìn)行重置。

1.1問題描述

本地頁面b1.html要訪問異域b2.html的數(shù)據(jù)

1.2環(huán)境配置

b1.html 和 b3.html我們放在express中的app.js運(yùn)行
地址分別為:http://localhost:3000/b1.htmlhttp://localhost:3000/b3.html
b2.html 的代碼巧娱,我放在http://localhost:3001/b2.html

1.3原理

b1.html通過iframe框架加載一個b2.html頁面碉怔,h2.html有window.name=data,但是因?yàn)槭钱愑蜻@個數(shù)據(jù)h1.html拿不到禁添,所以讓b2.html讓iframe指向同域的b3.html撮胧,通過b3.html拿到數(shù)據(jù)

  • b1.html前端設(shè)置
       <iframe src="http://localhost:3001/b2" frameborder="0"></iframe>
        let ifr=document.getElementsByTagName('iframe')[0];
        ifr.style.display='none';
        ifr.onload=function(){//加載b2
            ifr.src='http://localhost:3000/b3';
            ifr.onload=function(){//加載b3
                console.log(contentWindow.name)
            }
        }
  • 異域b2.html前端設(shè)置
window.name='這是window.name請求跨域的數(shù)據(jù)' 
  • 同域的b3.html頁面不需要任何設(shè)置

postMessage

window.postMessage(message,targetOrigin) 方法是html5新引進(jìn)的特性,可以使用它來向其它的window對象發(fā)送消息老翘,無論這個window對象是屬于同源或不同源芹啥,目前IE8+、FireFox铺峭、Chrome墓怀、Opera等瀏覽器都已經(jīng)支持window.postMessage方法。

調(diào)用postMessage方法的window對象是指要接收消息的那一個window對象卫键,該方法的第一個參數(shù)message為要發(fā)送的消息傀履,類型只能為字符串;第二個參數(shù)targetOrigin用來限定接收消息的那個window對象所在的域莉炉,如果不想限定域钓账,可以使用通配符 * 。

需要接收消息的window對象呢袱,可是通過監(jiān)聽自身的message事件來獲取傳過來的消息官扣,消息內(nèi)容儲存在該事件對象的data屬性中。

上面所說的向其他window對象發(fā)送消息羞福,其實(shí)就是指一個頁面有幾個框架的那種情況惕蹄,因?yàn)槊恳粋€框架都有一個window對象。在討論第二種方法的時候,我們說過卖陵,不同域的框架間是可以獲取到對方的window對象的遭顶,而且也可以使用window.postMessage這個方法。

1.1問題描述

本地頁面c1.html要訪問異域c2.html的數(shù)據(jù)

1.2環(huán)境配置

c1.html的地址:http://localhost:3000/c1.html
c2.html 的地址泪蔫,http://localhost:3001/c2.html

1.3原理

  • 給iframe上的window調(diào)用postMessage(data棒旗,origin)
  • 通過觸發(fā)window上的message事件,來接受數(shù)據(jù)
  • 通過parent.postMessage()繼續(xù)發(fā)送數(shù)據(jù)
  • 通過觸發(fā)window上的message事件撩荣,來接受數(shù)據(jù)
  • c1.html的前端設(shè)置
    <iframe src="http://localhost:3001/c2" frameborder="0"></iframe>
    <script>
        window.onload=function(){
            let targetOrigin='http://localhost:30001';
            window.frames[0].postMessage('這是c1傳給c2的數(shù)據(jù)',targetOrigin)
        };
        window.addEventListener('message',e=>{
            console.log('c1已結(jié)接收到c2的數(shù)據(jù)'+e.data)
        })
    </script>
  • c2.html的前端設(shè)置
    <iframe src="http://localhost:3001/c2" frameborder="0"></iframe>
    <script>
        window.onload=function(){
            let targetOrigin='http://localhost:3001';
            window.frames[0].postMessage('這是c1傳給c2的數(shù)據(jù)',targetOrigin)
        };
        window.addEventListener('message',e=>{
            console.log('c1已結(jié)接收到c2的數(shù)據(jù)'+e.data)
        })
    </script>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末铣揉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子餐曹,更是在濱河造成了極大的恐慌逛拱,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件台猴,死亡現(xiàn)場離奇詭異朽合,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)饱狂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門曹步,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人休讳,你說我怎么就攤上這事讲婚。” “怎么了衍腥?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵磺樱,是天一觀的道長纳猫。 經(jīng)常有香客問我婆咸,道長,這世上最難降的妖魔是什么芜辕? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任尚骄,我火速辦了婚禮,結(jié)果婚禮上侵续,老公的妹妹穿的比我還像新娘倔丈。我一直安慰自己,他們只是感情好状蜗,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布需五。 她就那樣靜靜地躺著,像睡著了一般轧坎。 火紅的嫁衣襯著肌膚如雪宏邮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機(jī)與錄音蜜氨,去河邊找鬼械筛。 笑死,一個胖子當(dāng)著我的面吹牛飒炎,可吹牛的內(nèi)容都是我干的埋哟。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼郎汪,長吁一口氣:“原來是場噩夢啊……” “哼赤赊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起煞赢,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤砍鸠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后耕驰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爷辱,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年朦肘,在試婚紗的時候發(fā)現(xiàn)自己被綠了饭弓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡媒抠,死狀恐怖弟断,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情趴生,我是刑警寧澤阀趴,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站苍匆,受9級特大地震影響刘急,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜浸踩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一叔汁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧检碗,春花似錦据块、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至怕犁,卻和暖如春边篮,著一層夾襖步出監(jiān)牢的瞬間开睡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工苟耻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留篇恒,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓凶杖,卻偏偏與公主長得像胁艰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子智蝠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

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

  • 1. 什么是跨域腾么? 跨域一詞從字面意思看,就是跨域名嘛杈湾,但實(shí)際上跨域的范圍絕對不止那么狹隘解虱。具體概念如下:只要協(xié)議...
    w_zhuan閱讀 512評論 0 0
  • 題目1.什么是同源策略? 同源策略(Same origin Policy): 瀏覽器出于安全方面的考慮,只允許與本...
    FLYSASA閱讀 1,709評論 0 6
  • 來吧漆撞,少年殴泰,今天還能看文章學(xué)習(xí)的,一多半都是單身貴族浮驳,看朋友圈還會被虐悍汛,不如學(xué)習(xí),上街還會被虐至会,不如學(xué)習(xí)离咐,痛并快樂...
    范小飯_閱讀 7,920評論 3 24
  • 由于瀏覽器的同源策略保護(hù)機(jī)制,瀏覽器不能執(zhí)行來自其他來源的腳本奉件。通過js在不同的域之間進(jìn)行數(shù)據(jù)傳輸或通信宵蛀,比如用a...
    威少_吳閱讀 1,376評論 0 2
  • 1. 什么是跨域? 跨域一詞從字面意思看县貌,就是跨域名嘛术陶,但實(shí)際上跨域的范圍絕對不止那么狹隘。具體概念如下:只要協(xié)議...
    他在發(fā)呆閱讀 822評論 0 0