1. 程式人生 > >django做服務端 window.name javascript跨域實現原理及實例

django做服務端 window.name javascript跨域實現原理及實例

字符串 tex 並且 ble blog char src 兩個 splay

項目地址:https://github.com/blff122620/jsLibary/tree/master/crossDomainDemo

原理如下: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)。換句話說,name屬性不會因為頁面的url變化而變化,這就給跨域提供了機會。 我們可以在源頁面中利用iframe標簽嵌套要請求的目標頁面,在目標頁面設置window.name屬性,即把要請求的信息賦給window.name。但是問題來了,兩個頁面處於不同域,源頁面並不能獲得目標頁面的name值,因為name值只對位於同一域中的頁面是可見的。此時,我們需要將iframe導航回與源頁面處於同一域中air.html頁面(即一個空頁面,在這裏充當一個中轉的角色),上面說了這時候的name值依舊保持不變,那麽我們就可以獲取到它了。

技術分享
 1 var getCORData = function(url,ghostUrl,callback){
 2     var iframe = document.createElement("iframe");
 3         iframe.style.display = "none";
 4         iframe.src = url;
 5         var body = document.body,
 6             state = 0 ;
 7                         
 8         iframe.onload = function
(){ 9 if(state == 1){ 10 callback(iframe.contentWindow.name); 11 body.removeChild(iframe);//移除iframe,清理出內存 12 } 13 //這裏是第一次跨域請求結束後,將src指定為ghost頁面,這是因為name值只對位於同一域中的頁面是可見的 14 else if(state == 0){ 15 iframe.src = ghostUrl;//
這裏可以替換為自己的代理空頁面 16 17 state = 1; 18 } 19 }; 20 body.appendChild(iframe); 21 }; 22 window.onload = function(){ 23 $$("#start").value = window.location.protocol + "//" + window.location.host + "/ghost"; 24 $$("button").onclick=function(){ 25 26 getCORData($$("#end").value,$$("#start").value ,function(data){ 27 var outcome = JSON.parse(data);//這裏接收傳過了json格式的string 28 $$("#result").innerHTML = outcome.result; 29 }); 30 31 32 }; 33 };
request.html

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>data</title>
</head>
<body>
    <script type="text/javascript">
        var data = {{data|safe}};
        window.name = JSON.stringify(data);
    </script>
</body>
</html>

django做服務端 window.name javascript跨域實現原理及實例