摘要:可以說是構(gòu)建在同源策略基礎(chǔ)之上的,瀏覽器只是針對同源策略的一種實(shí)現(xiàn)。只能設(shè)置為主域名,不可以在中將設(shè)置為。問題安全性,當(dāng)一個站點(diǎn)被攻擊后,另一個站點(diǎn)會引起安全漏洞。在此處執(zhí)行利用和這個辦法比較繞,但是可以解決完全跨域情況下的腳步置換問題。
ajax之面試必問跨域問題,如果你知道jsonp就弱爆了,往深處稍微問那么一丟丟,你就會被虐的萬劫不復(fù)...個人總結(jié)ajax:
1、什么是跨域
2、document.domain+iframe的設(shè)置
3、動態(tài)創(chuàng)建script
4、利用iframe和location.hash
5、window.name實(shí)現(xiàn)的跨域數(shù)據(jù)傳輸
6、使用HTML5 postMessage
7、利用flash
同源策略:同源策略(Same origin policy)是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,則瀏覽器的正常功能可能都會受到影響。可以說Web是構(gòu)建在同源策略基礎(chǔ)之上的,瀏覽器只是針對同源策略的一種實(shí)現(xiàn)。所謂同源是指,域名,協(xié)議,端口相同。不同源的客戶端腳本(javascript、ActionScript)在沒明確授權(quán)的情況下,不能讀寫對方的資源。
看看下面的表格,分析下主域名和子域名,跨域和IP是不同的,詳見表格吧~
對于主域相同而子域不同的例子,可以通過設(shè)置document.domain的辦法來解決。具體的做法是可以在http://www.a.com/a.html和http://script.a.com/b.html兩個文件中分別加上document.domain = ‘a(chǎn).com’;然后通過a.html文件中創(chuàng)建一個iframe,去控制iframe的contentDocument,這樣兩個js文件之間就可以“交互”了。當(dāng)然這種辦法只能解決主域相同而二級域名不同的情況,如果你異想天開的把script.a.com的domian設(shè)為alibaba.com那顯然是會報(bào)錯地!代碼如下:
www.a.com上的a.html
document.domain = "a.com"; var ifr = document.createElement("iframe"); ifr.src = "http://script.a.com/b.html"; ifr.style.display = "none"; document.body.appendChild(ifr); ifr.onload = function(){ var doc = ifr.contentDocument || ifr.contentWindow.document; // 在這里操縱b.html alert(doc.getElementsByTagName("h1")[0].childNodes[0].nodeValue); };
script.a.com上的b.html
document.domain = "a.com";
這種方式適用于{www.kuqin.com, kuqin.com, script.kuqin.com, css.kuqin.com}中的任何頁面相互通信。
備注:某一頁面的domain默認(rèn)等于window.location.hostname。主域名是不帶www的域名,例如a.com,主域名前面帶前綴的通常都為二級域名或多級域名,例如www.a.com其實(shí)是二級域名。 domain只能設(shè)置為主域名,不可以在b.a.com中將domain設(shè)置為c.a.com。
問題:
1、安全性,當(dāng)一個站點(diǎn)(b.a.com)被攻擊后,另一個站點(diǎn)(c.a.com)會引起安全漏洞。
2、如果一個頁面中引入多個iframe,要想能夠操作所有iframe,必須都得設(shè)置相同domain。
雖然瀏覽器默認(rèn)禁止了跨域訪問,但并不禁止在頁面中引用其他域的JS文件,并可以自由執(zhí)行引入的JS文件中的function(包括操作cookie、Dom等等)。根據(jù)這一點(diǎn),可以方便地通過創(chuàng)建script節(jié)點(diǎn)的方法來實(shí)現(xiàn)完全跨域的通信。具體的做法可以參考YUI的Get Utility
這里判斷script節(jié)點(diǎn)加載完畢還是蠻有意思的:ie只能通過script的readystatechange屬性,其它瀏覽器是script的load事件。以下是部分判斷script加載完畢的方法。
js.onload = js.onreadystatechange = function() { if (!this.readyState || this.readyState === "loaded" || this.readyState === "complete") { // callback在此處執(zhí)行 js.onload = js.onreadystatechange = null; } };利用iframe和location.hash
這個辦法比較繞,但是可以解決完全跨域情況下的腳步置換問題。原理是利用location.hash來進(jìn)行傳值。在url: http://a.com#helloword中的‘#helloworld’就是location.hash,改變hash并不會導(dǎo)致頁面刷新,所以可以利用hash值來進(jìn)行數(shù)據(jù)傳遞,當(dāng)然數(shù)據(jù)容量是有限的。假設(shè)域名a.com下的文件cs1.html要和cnblogs.com域名下的cs2.html傳遞信息,cs1.html首先創(chuàng)建自動創(chuàng)建一個隱藏的iframe,iframe的src指向cnblogs.com域名下的cs2.html頁面,這時的hash值可以做參數(shù)傳遞用。cs2.html響應(yīng)請求后再將通過修改cs1.html的hash值來傳遞數(shù)據(jù)(由于兩個頁面不在同一個域下IE、Chrome不允許修改parent.location.hash的值,所以要借助于a.com域名下的一個代理iframe;Firefox可以修改)。同時在cs1.html上加一個定時器,隔一段時間來判斷l(xiāng)ocation.hash的值有沒有變化,一點(diǎn)有變化則獲取獲取hash值。代碼如下:
先是a.com下的文件cs1.html文件:
function startRequest(){ var ifr = document.createElement("iframe"); ifr.style.display = "none"; ifr.src = "http://www.cnblogs.com/lab/cscript/cs2.html#paramdo"; document.body.appendChild(ifr); } function checkHash() { try { var data = location.hash ? location.hash.substring(1) : ""; if (console.log) { console.log("Now the data is "+data); } } catch(e) {}; } setInterval(checkHash, 2000);
cnblogs.com域名下的cs2.html:
//模擬一個簡單的參數(shù)處理操作 switch(location.hash){ case "#paramdo": callBack(); break; case "#paramset": //do something…… break; } function callBack(){ try { parent.location.hash = "somedata"; } catch (e) { // ie、chrome的安全機(jī)制無法修改parent.location.hash, // 所以要利用一個中間的cnblogs域下的代理iframe var ifrproxy = document.createElement("iframe"); ifrproxy.style.display = "none"; ifrproxy.src = "http://a.com/test/cscript/cs3.html#somedata"; // 注意該文件在"a.com"域下 document.body.appendChild(ifrproxy); } }
a.com下的域名cs3.html
//因?yàn)閜arent.parent和自身屬于同一個域,所以可以改變其location.hash的值 parent.parent.location.hash = self.location.hash.substring(1);4、window.name實(shí)現(xiàn)的跨域數(shù)據(jù)傳輸 5、使用HTML5 postMessage 6、利用flash
詳細(xì)的介紹請查看http://www.cnblogs.com/rainman/archive/2011/02/20/1959325.html#m3此鏈接
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/115114.html
摘要:可以說是構(gòu)建在同源策略基礎(chǔ)之上的,瀏覽器只是針對同源策略的一種實(shí)現(xiàn)。只能設(shè)置為主域名,不可以在中將設(shè)置為。問題安全性,當(dāng)一個站點(diǎn)被攻擊后,另一個站點(diǎn)會引起安全漏洞。在此處執(zhí)行利用和這個辦法比較繞,但是可以解決完全跨域情況下的腳步置換問題。 ajax之面試必問跨域問題,如果你知道jsonp就弱爆了,往深處稍微問那么一丟丟,你就會被虐的萬劫不復(fù)...個人總結(jié)ajax: 1、什么是跨域2、d...
摘要:可以說是構(gòu)建在同源策略基礎(chǔ)之上的,瀏覽器只是針對同源策略的一種實(shí)現(xiàn)。只能設(shè)置為主域名,不可以在中將設(shè)置為。問題安全性,當(dāng)一個站點(diǎn)被攻擊后,另一個站點(diǎn)會引起安全漏洞。在此處執(zhí)行利用和這個辦法比較繞,但是可以解決完全跨域情況下的腳步置換問題。 ajax之面試必問跨域問題,如果你知道jsonp就弱爆了,往深處稍微問那么一丟丟,你就會被虐的萬劫不復(fù)...個人總結(jié)ajax: 1、什么是跨域2、d...
摘要:跨域?qū)嵲谑敲嬖嚬僖粋€人的利器。首先,什么是是一個標(biāo)準(zhǔn),全稱是跨域資源共享。它的值是一個布爾值,表示是否允許發(fā)送。設(shè)為,即表示服務(wù)器明確許可,可以包含在請求中,一起發(fā)給服務(wù)器。 面試問到數(shù)據(jù)交互的時候,經(jīng)常會問跨域如何處理。大部分人都會回答JSONP,然后面試官緊接著就會問:JSONP缺點(diǎn)是什么啊?這個時候坑就來了,如果面試者說它支持GET方式,然后面試官就會追問,那如果POST方式發(fā)送...
摘要:經(jīng)歷月份開放的簡歷,收到了蠻多詢問和面試,算是招人旺季,需要跳槽的小伙伴抓住機(jī)會。現(xiàn)在是面試了家公司左右,有些高頻問題會標(biāo)記次數(shù)總次數(shù),可供大家參考。最后祝大家面試順利,拿到心儀的,寫錯的地方請不吝賜教,謝謝。 經(jīng)歷 7月份開放的簡歷,收到了蠻多詢問和面試,算是招人旺季,需要跳槽的小伙伴抓住機(jī)會。一開始廣泛看面試題,沒抓住重點(diǎn)復(fù)習(xí),有很多平時也沒怎么用到,導(dǎo)致一開始面試的時候,問的問題...
閱讀 3960·2021-11-24 09:38
閱讀 1225·2021-10-19 11:42
閱讀 1828·2021-10-14 09:42
閱讀 2153·2019-08-30 15:44
閱讀 543·2019-08-30 14:04
閱讀 2888·2019-08-30 13:13
閱讀 1949·2019-08-30 12:51
閱讀 955·2019-08-30 11:22