成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript跨域方式

Cciradih / 1323人閱讀

摘要:跨域原因同源策略在客戶端編程語言中,如和,同源策略是一個很重要的安全理念,它在保證數(shù)據(jù)的安全性方面有著重要的意義。同源策略規(guī)定跨域之間的腳本是隔離的,一個域的腳本不能訪問和操作另外一個域的絕大部分屬性和方法。由兩部分組成回調(diào)函數(shù)和數(shù)據(jù)。

1.JavaScript跨域原因--同源策略

在客戶端編程語言中,如javascript和 ActionScript,同源策略是一個很重要的安全理念,它在保證數(shù)據(jù)的安全性方面有著重要的意義。同源策略規(guī)定跨域之間的腳本是隔離的,一個域的腳本不能訪問和操作另外一個域的絕大部分屬性和方法。那么什么叫相同域,什么叫不同的域呢?當(dāng)兩個域具有相同的協(xié)議(如http), 相同的端口(如80),相同的host(如www.example.org),那么我們就可以認(rèn)為它們是相同的域。比如 http://www.example.org/index....和http://www.example.org/sub/in...是同域,而http://www.example.org, https://www.example.org, http://www.example.org:8080, http://sub.example.org中的任何兩個都將構(gòu)成跨域。同源策略還應(yīng)該對一些特殊情況做處理,比如限制file協(xié)議下腳本的訪問權(quán)限。本地的HTML文件在瀏覽器中是通過file協(xié)議打開的,如果腳本能通過file協(xié)議訪問到硬盤上其它任意文件,就會出現(xiàn)安全隱患,目前IE8還有這樣的隱患。

由于JavaScript同源策略的限制,跨域資源共享就會受到制約:a.com域名下的js無法訪問b.com或c.a.com下的對象,雖然保證了安全,但是給注入iframe和AJAX應(yīng)用帶來麻煩??缬虻南拗凭唧w表現(xiàn)為:

注意:只有協(xié)議、域名、端口號完全一樣才是同一域,其他情況,即使是相對應(yīng)的IP和域名也是不同域。

解決跨域問題的方式 單向跨域 JSONP、window.name、server proxy 雙向跨域 document.domain、window.postMessage 后端方法

:https://developer.yahoo.com/j...

server proxy

在數(shù)據(jù)提供方?jīng)]有提供對JSONP協(xié)議或者 window.name協(xié)議的支持,也沒有對其它域開放訪問權(quán)限時,我們可以通過server proxy的方式來抓取數(shù)據(jù)。例如當(dāng)www.a.com域下的頁面需要請求www.b.com下的資源文件asset.txt時,直接發(fā)送一個指向 www.b.com/asset.txt的Ajax請求肯定是會被瀏覽器阻止。這時,我們在www.a.com下配一個代理,然后把Ajax請求綁定到這個代理路徑下,例如www.a.com/proxy/, 然后這個代理發(fā)送HTTP請求訪問www.b.com下的asset.txt,跨域的HTTP請求是在服務(wù)器端進(jìn)行的,客戶端并沒有產(chǎn)生跨域的Ajax請求。這個跨域方式不需要和目標(biāo)資源簽訂協(xié)議,帶有侵略性,另外需要注意的是實踐中應(yīng)該對這個代理實施一定程度的保護(hù),比如限制他人使用或者使用頻率。

前端方法: 方法1 document.domain+iframe

適用于:主域相同而子域不同(二級域名相同、協(xié)議相同、端口相同)。
具體的做法是可以在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文件之間就可以“交互”了。

    
    //www.a.com上的a.html
    document.domain = "a.com";
    var ifr = document.createElement("iframe");//創(chuàng)建子框架
    ifr.src = "http://script.a.com/b.html"; //子框架指向b.html
    ifr.style.display = "none";
    document.body.appendChild(ifr);
    ifr.onload = function(){
        //定義指針指向子框架內(nèi)容的文檔對象, 跨瀏覽器兼容
        var doc = ifr.contentDocument || ifr.contentWindow.document;
        // 獲得子框架的文檔對象之后在這里操縱b.html
        alert(doc.getElementsByTagName("h1")[0].childNodes[0].nodeValue);
    };

注意:除IE外的四大瀏覽器支持contentDocument屬性,IE8以下只支持contentWindow對象,這個對象具有document屬性,這個屬性的效果和contentDocument屬性一致。

    //script.a.com上的b.html
    document.domain = "a.com";

問題:

1、安全性,當(dāng)一個站點(b.a.com)被攻擊后,另一個站點(c.a.com)會引起安全漏洞。
2、如果一個頁面中引入多個iframe,要想能夠操作所有iframe,必須都得設(shè)置相同domain。
方法2: 跨文檔消息傳遞 cross-document messaging,XDM(HTML5新增)

適用:這個方法非常強大,無視協(xié)議,端口,域名的不同。

otherWindow.postMessage(message, targetOrigin);
參數(shù): otherWindow: 對接收信息頁面的window的引用??梢允?頁面中iframe的 contentWindow屬性;window.open的返回值;通過name或下標(biāo)從window.frames取到的值。

message: 所要發(fā)送的數(shù)據(jù),string類型。
targetOrigin: 用于限制otherWindow,“*”表示不作限制

a.com/index.html中的代碼:



b.com/index.html中的代碼:


方法3 JSONP(JSON with padding)

原理:使用

閱讀需要支付1元查看
<