window.name實現跨域


   在 http://www.cnblogs.com/zhuzhenwei918/p/6759459.html 這篇文章中,我提到了幾種跨域的方式,這里主要講解使用window.name實現跨域。

   跨域就是說必須同協議、域名、端口號,我們才能獲取其內容,對其進行訪問。 

 

  window.name這個屬性不是一個簡單的全局屬性 --- 只要在一個window下,無論url怎么變化,只要設置好了window.name,那么后續就一直都不會改變,同理,在iframe中,即使url在變化,iframe中的window.name也是一個固定的值,利用這個,我們就可以實現跨域了。

  下面是localhost:8088/test2.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>test2</title>
</head>
<body>
  <h2>test2頁面</h2>
  <script>
    var person = {
      name: 'wayne zhu',
      age: 22,
      school: 'xjtu'
    }
    window.name = JSON.stringify(person)
  </script>
</body>
</html>

  即我們希望吧test2.html中的數據傳遞出去,到localhost:8081/test1.html中去。 

 

  下面是localhost:8081/test1.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>test1</title>
</head>
<body>
  <h2>test1頁面</h2>
  <iframe src="http://localhost:8088/test2.html" frameborder="1"></iframe>
  <script>
    var ifr = document.querySelector('iframe')
    ifr.style.display = 'none'
    var flag = 0;
    ifr.onload = function () {
        if (flag == 1) {
            console.log('跨域獲取數據', ifr.contentWindow.name);
            ifr.contentWindow.close();
        } else if (flag == 0) {
            flag = 1;
            ifr.contentWindow.location = 'http://localhost:8081/proxy.html';
        }
    }
  </script>
</body>
</html>

       這里的意圖很明確,就是使用iframe將test2.html加載過來,因為只是為了實現跨域,所以將之隱藏,但是,這時已經完成了最重要的一步,就是將iframe中window.name已經成功設置,但是現在還獲取不了,因為是跨域的,所以,我們可以把src設置為當前域的proxy.html。

  另外,這里之所以要設置flag,是因為每當改變location的時候,就會重新來一次onload,所以我們希望獲取到數據之后,就直接close(),故采用此種方法。

 

這個proxy.html內容如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>proxy</title>
</head>
<body>
  <p>這是proxy頁面</p>
</body>
</html>

  是的,什么都沒有,當然,我們也可以把src就替換成test1.html,但是這樣的壞處很明顯,就是需要把test1.html中的數據加載一遍,這不是我們所希望的。

  

  

  OK! 這樣,就成功完成了跨域! 

  代碼: https://github.com/zzw918/cross-origin

  

  

  

  

 

 

 

 

 

 

   

  如我們希望localhost:8081/test1.html可以訪問到localhost:8088/test2.html中的數據,正常來說,由於跨域,這一定是不可能的,一般的實現思路可以是這樣的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM