在IFrame中使用postMessage跨域

我們?cè)谇岸隧?yè)面開發(fā)中团甲,常常會(huì)用到iframe。
而且我們?cè)谑褂胕frame的時(shí)候黍聂,大多數(shù)情況下不單單只是為了顯示頁(yè)面躺苦,還要與父窗口進(jìn)行交互,這時(shí)候就出現(xiàn)了跨域問題产还,iframe頁(yè)面并不能直接操作父窗口的元素匹厘。
我們可以使用html5的postMessage()解決這個(gè)問題。

一脐区、什么是跨域

跨域愈诚,指的是瀏覽器不能執(zhí)行其他網(wǎng)站的腳本。它是由瀏覽器的同源策略造成的牛隅,是瀏覽器施加的安全限制炕柔。所謂同源是指相同的域名、協(xié)議和端口媒佣,只要其中一項(xiàng)不同就為跨域匕累。
舉幾個(gè)例子:

  1. http://a.123.com/index.htmlhttp://a.123.com/index.js非跨域,它們有相同的域名默伍,協(xié)議和端口欢嘿。
  2. http://a.123.com/index.htmlhttp://b.123.com/index.js跨域,相同的端口也糊、協(xié)議炼蹦,但是域名不同(a.123.comb.123.com)。
  3. http://a.123.com:8080/index.htmlhttp://a.123.com:8081/index.js跨域显设,相同的域名框弛、協(xié)議辛辨,但是端口不同(8080和8081)捕捂。
  4. http://a.123.com/index.htmlhttps://a.123.com/index.js跨域跨域瑟枫,相同的域名、端口指攒,但是協(xié)議不同(http和https)慷妙。

二、postMessage()基本用法

【發(fā)送消息】

otherWindow.postMessage(message, targetOrigin, [transfer])
  • otherWindow
    其他窗口的一個(gè)引用允悦,寫的是你要通信的window對(duì)象膝擂。
    例如在iframe中向父窗口傳遞數(shù)據(jù)時(shí),可以寫成window.parent.postMessage()隙弛,window.parent表示父窗口架馋。
  • message
    需要傳遞的數(shù)據(jù),字符串或者對(duì)象都可以全闷。
  • targetOrigin
    表示目標(biāo)窗口的源叉寂,協(xié)議+域名+端口號(hào),如果設(shè)置為“*”总珠,則表示可以傳遞給任意窗口屏鳍。在發(fā)送消息的時(shí)候,如果目標(biāo)窗口的協(xié)議局服、域名或端口這三者的任意一項(xiàng)不匹配targetOrigin提供的值钓瞭,那么消息就不會(huì)被發(fā)送;只有三者完全匹配淫奔,消息才會(huì)被發(fā)送山涡。例如:
window.parent.postMessage('hello world','http://a.123.com:8080/index.html')

只有父窗口是http://a.123.com:8080時(shí)才會(huì)接受到傳遞的消息。

  • [transfer]
    可選參數(shù)搏讶。是一串和message 同時(shí)傳遞的 Transferable 對(duì)象佳鳖,這些對(duì)象的所有權(quán)將被轉(zhuǎn)移給消息的接收方,而發(fā)送一方將不再保有所有權(quán)媒惕。我們一般很少用到系吩。

【接收消息】

window.addEventListener('message', function (e) {
    console.log(e.data)  //e.data為傳遞過來(lái)的數(shù)據(jù)
    console.log(e.origin)  //e.origin為調(diào)用 postMessage 時(shí)消息發(fā)送方窗口的 origin(域名、協(xié)議和端口)
    console.log(e.source)  //e.source為對(duì)發(fā)送消息的窗口對(duì)象的引用妒蔚,可以使用此來(lái)在具有不同origin的兩個(gè)窗口之間建立雙向通信
})

三穿挨、iframe與父窗口交互數(shù)據(jù)例子

iframe傳遞關(guān)閉命令

父窗口接收到命令將iframe關(guān)閉

四、安全問題

  1. 如果你不希望從其他網(wǎng)站接收message肴盏,請(qǐng)不要為message事件添加任何事件監(jiān)聽科盛。
  2. 如果你確實(shí)希望從其他網(wǎng)站接收message,請(qǐng)始終使用origin和source屬性驗(yàn)證發(fā)件人的身份菜皂。任何窗口都可以向任何其他窗口發(fā)送消息贞绵,并且你不能保證未知發(fā)件人不會(huì)發(fā)送惡意消息。而且在驗(yàn)證身份后恍飘,你仍然應(yīng)該驗(yàn)證接收到的消息的語(yǔ)法榨崩,防止非法攻擊(例如SQL注入)谴垫。
  3. 使用postMessage將數(shù)據(jù)發(fā)送到其他窗口時(shí),應(yīng)該指定精確的目標(biāo)origin母蛛,而不是*翩剪。惡意網(wǎng)站可以在你不知情的情況下更改窗口的位置,因此它可以攔截使用postMessage發(fā)送的數(shù)據(jù)彩郊。

五前弯、兼容性

  1. IE6,IE7不支持秫逝。
  2. IE8+雖然支持postMessage恕出,但只支持iframe的方式,window.open打開的新窗口之間违帆,沒法用剃根。直到IE10才有相關(guān)改進(jìn)。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末前方,一起剝皮案震驚了整個(gè)濱河市狈醉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惠险,老刑警劉巖苗傅,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異班巩,居然都是意外死亡渣慕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門抱慌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)逊桦,“玉大人,你說我怎么就攤上這事抑进∏烤” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵寺渗,是天一觀的道長(zhǎng)匿情。 經(jīng)常有香客問我,道長(zhǎng)信殊,這世上最難降的妖魔是什么炬称? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮涡拘,結(jié)果婚禮上玲躯,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好跷车,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布晋控。 她就那樣靜靜地躺著,像睡著了一般姓赤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仲吏,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天不铆,我揣著相機(jī)與錄音,去河邊找鬼裹唆。 笑死誓斥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的许帐。 我是一名探鬼主播劳坑,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼成畦!你這毒婦竟也來(lái)了距芬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤循帐,失蹤者是張志新(化名)和其女友劉穎框仔,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拄养,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡离斩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瘪匿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跛梗。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖棋弥,靈堂內(nèi)的尸體忽然破棺而出核偿,到底是詐尸還是另有隱情,我是刑警寧澤顽染,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布宪祥,位于F島的核電站,受9級(jí)特大地震影響家乘,放射性物質(zhì)發(fā)生泄漏蝗羊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一仁锯、第九天 我趴在偏房一處隱蔽的房頂上張望耀找。 院中可真熱鬧,春花似錦、人聲如沸野芒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)狞悲。三九已至撮抓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間摇锋,已是汗流浹背丹拯。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荸恕,地道東北人乖酬。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像融求,于是被迫代替她去往敵國(guó)和親咬像。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

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

  • 我們?cè)谇岸隧?yè)面開發(fā)中生宛,常常會(huì)用到iframe县昂。而且我們?cè)谑褂胕frame的時(shí)候,大多數(shù)情況下不單單只是為了顯示頁(yè)面...
    壯哉我大前端閱讀 3,866評(píng)論 0 0
  • 1. 什么是跨域陷舅? 跨域一詞從字面意思看七芭,就是跨域名嘛,但實(shí)際上跨域的范圍絕對(duì)不止那么狹隘蔑赘。具體概念如下:只要協(xié)議...
    w_zhuan閱讀 518評(píng)論 0 0
  • 來(lái)吧狸驳,少年,今天還能看文章學(xué)習(xí)的缩赛,一多半都是單身貴族耙箍,看朋友圈還會(huì)被虐,不如學(xué)習(xí)酥馍,上街還會(huì)被虐辩昆,不如學(xué)習(xí),痛并快樂...
    范小飯_閱讀 7,946評(píng)論 3 24
  • 什么是跨域 跨域旨袒,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本汁针。它是由瀏覽器的同源策略造成的,是瀏覽器對(duì)JavaScript實(shí)...
    Yaoxue9閱讀 1,299評(píng)論 0 6
  • —— 每一段路都是一場(chǎng)領(lǐng)悟猾骡! 記得這個(gè)MV剛出的時(shí)候,印象沒有那么深刻,只是覺得勵(lì)志兴想,如今再次打開網(wǎng)易...
    thinkgamer閱讀 463評(píng)論 0 0