摘要:可以說是構(gòu)建在同源策略基礎(chǔ)之上的,瀏覽器只是針對(duì)同源策略的一種實(shí)現(xiàn)。只能設(shè)置為主域名,不可以在中將設(shè)置為。問題安全性,當(dāng)一個(gè)站點(diǎn)被攻擊后,另一個(gè)站點(diǎn)會(huì)引起安全漏洞。在此處執(zhí)行利用和這個(gè)辦法比較繞,但是可以解決完全跨域情況下的腳步置換問題。
ajax之面試必問跨域問題,如果你知道jsonp就弱爆了,往深處稍微問那么一丟丟,你就會(huì)被虐的萬劫不復(fù)...個(gè)人總結(jié)ajax:
1、什么是跨域
2、document.domain+iframe的設(shè)置
3、動(dòng)態(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)是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,則瀏覽器的正常功能可能都會(huì)受到影響。可以說Web是構(gòu)建在同源策略基礎(chǔ)之上的,瀏覽器只是針對(duì)同源策略的一種實(shí)現(xiàn)。所謂同源是指,域名,協(xié)議,端口相同。不同源的客戶端腳本(javascript、ActionScript)在沒明確授權(quán)的情況下,不能讀寫對(duì)方的資源。
看看下面的表格,分析下主域名和子域名,跨域和IP是不同的,詳見表格吧~
對(duì)于主域相同而子域不同的例子,可以通過設(shè)置document.domain的辦法來解決。具體的做法是可以在http://www.a.com/a.html和http://script.a.com/b.html兩個(gè)文件中分別加上document.domain = ‘a(chǎn).com’;然后通過a.html文件中創(chuàng)建一個(gè)iframe,去控制iframe的contentDocument,這樣兩個(gè)js文件之間就可以“交互”了。當(dāng)然這種辦法只能解決主域相同而二級(jí)域名不同的情況,如果你異想天開的把script.a.com的domian設(shè)為alibaba.com那顯然是會(huì)報(bào)錯(cuò)地!代碼如下:
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,主域名前面帶前綴的通常都為二級(jí)域名或多級(jí)域名,例如www.a.com其實(shí)是二級(jí)域名。 domain只能設(shè)置為主域名,不可以在b.a.com中將domain設(shè)置為c.a.com。
問題:
1、安全性,當(dāng)一個(gè)站點(diǎn)(b.a.com)被攻擊后,另一個(gè)站點(diǎn)(c.a.com)會(huì)引起安全漏洞。
2、如果一個(gè)頁面中引入多個(gè)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
這個(gè)辦法比較繞,但是可以解決完全跨域情況下的腳步置換問題。原理是利用location.hash來進(jìn)行傳值。在url: http://a.com#helloword中的‘#helloworld’就是location.hash,改變hash并不會(huì)導(dǎo)致頁面刷新,所以可以利用hash值來進(jìn)行數(shù)據(jù)傳遞,當(dāng)然數(shù)據(jù)容量是有限的。假設(shè)域名a.com下的文件cs1.html要和cnblogs.com域名下的cs2.html傳遞信息,cs1.html首先創(chuàng)建自動(dòng)創(chuàng)建一個(gè)隱藏的iframe,iframe的src指向cnblogs.com域名下的cs2.html頁面,這時(shí)的hash值可以做參數(shù)傳遞用。cs2.html響應(yīng)請(qǐng)求后再將通過修改cs1.html的hash值來傳遞數(shù)據(jù)(由于兩個(gè)頁面不在同一個(gè)域下IE、Chrome不允許修改parent.location.hash的值,所以要借助于a.com域名下的一個(gè)代理iframe;Firefox可以修改)。同時(shí)在cs1.html上加一個(gè)定時(shí)器,隔一段時(shí)間來判斷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:
//模擬一個(gè)簡單的參數(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, // 所以要利用一個(gè)中間的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和自身屬于同一個(gè)域,所以可以改變其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ì)的介紹請(qǐng)查看http://www.cnblogs.com/rainman/archive/2011/02/20/1959325.html#m3此鏈接
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/78939.html
摘要:可以說是構(gòu)建在同源策略基礎(chǔ)之上的,瀏覽器只是針對(duì)同源策略的一種實(shí)現(xiàn)。只能設(shè)置為主域名,不可以在中將設(shè)置為。問題安全性,當(dāng)一個(gè)站點(diǎn)被攻擊后,另一個(gè)站點(diǎn)會(huì)引起安全漏洞。在此處執(zhí)行利用和這個(gè)辦法比較繞,但是可以解決完全跨域情況下的腳步置換問題。 ajax之面試必問跨域問題,如果你知道jsonp就弱爆了,往深處稍微問那么一丟丟,你就會(huì)被虐的萬劫不復(fù)...個(gè)人總結(jié)ajax: 1、什么是跨域2、d...
摘要:可以說是構(gòu)建在同源策略基礎(chǔ)之上的,瀏覽器只是針對(duì)同源策略的一種實(shí)現(xiàn)。只能設(shè)置為主域名,不可以在中將設(shè)置為。問題安全性,當(dāng)一個(gè)站點(diǎn)被攻擊后,另一個(gè)站點(diǎn)會(huì)引起安全漏洞。在此處執(zhí)行利用和這個(gè)辦法比較繞,但是可以解決完全跨域情況下的腳步置換問題。 ajax之面試必問跨域問題,如果你知道jsonp就弱爆了,往深處稍微問那么一丟丟,你就會(huì)被虐的萬劫不復(fù)...個(gè)人總結(jié)ajax: 1、什么是跨域2、d...
摘要:跨域?qū)嵲谑敲嬖嚬僖粋€(gè)人的利器。首先,什么是是一個(gè)標(biāo)準(zhǔn),全稱是跨域資源共享。它的值是一個(gè)布爾值,表示是否允許發(fā)送。設(shè)為,即表示服務(wù)器明確許可,可以包含在請(qǐng)求中,一起發(fā)給服務(wù)器。 面試問到數(shù)據(jù)交互的時(shí)候,經(jīng)常會(huì)問跨域如何處理。大部分人都會(huì)回答JSONP,然后面試官緊接著就會(huì)問:JSONP缺點(diǎn)是什么啊?這個(gè)時(shí)候坑就來了,如果面試者說它支持GET方式,然后面試官就會(huì)追問,那如果POST方式發(fā)送...
摘要:經(jīng)歷月份開放的簡歷,收到了蠻多詢問和面試,算是招人旺季,需要跳槽的小伙伴抓住機(jī)會(huì)。現(xiàn)在是面試了家公司左右,有些高頻問題會(huì)標(biāo)記次數(shù)總次數(shù),可供大家參考。最后祝大家面試順利,拿到心儀的,寫錯(cuò)的地方請(qǐng)不吝賜教,謝謝。 經(jīng)歷 7月份開放的簡歷,收到了蠻多詢問和面試,算是招人旺季,需要跳槽的小伙伴抓住機(jī)會(huì)。一開始廣泛看面試題,沒抓住重點(diǎn)復(fù)習(xí),有很多平時(shí)也沒怎么用到,導(dǎo)致一開始面試的時(shí)候,問的問題...
閱讀 2578·2021-09-30 09:48
閱讀 2568·2019-08-30 14:10
閱讀 2712·2019-08-29 11:22
閱讀 1841·2019-08-26 13:51
閱讀 2279·2019-08-26 12:02
閱讀 2420·2019-08-23 16:06
閱讀 3557·2019-08-23 14:06
閱讀 1096·2019-08-23 13:56