window.name解決跨域資料轉送問題

來源:互聯網
上載者:User

原文:http://research.microsoft.com/~helenw/papers/subspace.pdf

window.name 傳輸技術,原本是 Thomas Frank 用於解決 cookie 的一些劣勢(每個網域名稱 4 x 20 Kb 的限制、資料只能是字串、設定和擷取 cookie 文法的複雜等等)而發明的(詳細見原文:《Session variables without cookies》),後來 Kris Zyp 在此方法的基礎上強化了 window.name 傳輸 ,並引入到了 Dojo (dojox.io.windowName),用來解決跨域資料轉送問題。

window.name 的美妙之處:name 值在不同的頁面(甚至不同網域名稱)載入後依舊存在,並且可以支援非常長的 name 值(2MB)。

window.name 傳輸技術的基本原理和步驟為:

name 在瀏覽器環境中是一個全域/window對象的屬性,且當在 frame 中載入新頁面時,name 的屬性值依舊保持不變。通過在 iframe 中載入一個資源,該目標頁面將設定 frame 的 name 屬性。此 name 屬性值可被擷取到,以訪問 Web 服務發送的資訊。但 name 屬性僅對相同網域名稱的 frame 可訪問。這意味著為了訪問 name 屬性,當遠程 Web 服務頁面被載入後,必須導航 frame 回到原始域。同源策略依舊防止其他 frame 訪問 name 屬性。一旦 name 屬性獲得,銷毀 frame 。

在最頂層,name 屬性是不安全的,對於所有後續頁面,設定在 name 屬性中的任何資訊都是可獲得的。然而 windowName 模組總是在一個 iframe 中載入資源,並且一旦擷取到資料,或者當你在最頂層瀏覽了一個新頁面,這個 iframe 將被銷毀,所以其他頁面永遠訪問不到 window.name 屬性。

基本實現代碼,基於 YUI,源自 克軍寫的範例:

(function(){
    var YUD = YAHOO.util.Dom, YUE = YAHOO.util.Event;

    dataRequest = {
        _doc: document,
        cfg: {
            proxyUrl: "proxy.html"
        }
    };

    dataRequest.send = function(sUrl, fnCallBack){
        if(!sUrl typeof sUrl !== "string"){
            return;
        }

        sUrl += (sUrl.indexOf("?") > 0 ? "&" : "?") + "windowname=true";

        var frame = this._doc.createElement("iframe"), state = 0, self = this;
        this._doc.body.appendChild(frame);
        frame.style.display = "none";

        var clear = function(){
            try{
                frame.contentWindow.document.write("");
                frame.contentWindow.close();
                self._doc.body.removeChild(frame);
            }catch(e){}
        };

        var getData = function(){
            try{
                var da = frame.contentWindow.name;
            }catch(e){}
            clear();
            if(fnCallBack && typeof fnCallBack === "function"){
                fnCallBack(da);
            }
        };

        YUE.on(frame, "load", function(){
            if(state === 1){
                getData();
            } else if(state === 0){
                state = 1;
                frame.contentWindow.location = self.cfg.proxyUrl;
            }
        });

        frame.src = sUrl;
    };
})();



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。