前端跨域問題的解決方案

跨域是瀏覽器的一種安全策略,是瀏覽器自身作的限制,不容許用戶訪問不一樣域名或端口或協議的網站數據。javascript

只有域名(主域名【一級域名】和二級域名)、端口號、協議 徹底相同的時候,才容許通訊。php

# 那麼,如何解決跨域問題?html

* 1:動態建立script標籤前端

   - 使用jQuery的ajax請求時,當參數傳入的是jsonp,使用的就是這種方法java

  

1 <script>
2     function fuc(a){
3         console.log(a.name);
4     }
5 </script>
6 <script src="http://api.study.com/02_jsonp.php?callback=fuc"></script>
<?php
    header('Content-Type:text/html;charset=utf-8');

    /*處理業務邏輯  返回數據給第三方過的的接口*/

    $callback = $_GET['callback'];

    $json = '{"name":"cxh","age":"18"}';

    echo $callback.'('.$json.')';  //給接收的函數一個參數,並返回到頁面
?>

* 2:使用HTML5 的 postMessagejquery

1 <iframe id="ifr" src="b.com/index.html"></iframe>
2 <script type="text/javascript">
3 window.onload = function() {
4     var ifr = document.getElementById('ifr');
5     var targetOrigin = 'http://b.com';  // 若寫成'http://b.com/c/proxy.html'效果同樣
6                                         // 若寫成'http://c.com'就不會執行postMessage了
7     ifr.contentWindow.postMessage('I was there!', targetOrigin);
8 };
9 </script>
 1 <script type="text/javascript">
 2     window.addEventListener('message', function(event){
 3         // 經過origin屬性判斷消息來源地址
 4         if (event.origin == 'http://a.com') {
 5             alert(event.data);    // 彈出"I was there!"
 6             alert(event.source);  // 對a.com、index.html中window對象的引用
 7                                   // 但因爲同源策略,這裏event.source不能夠訪問window對象
 8         }
 9     }, false);
10 </script>

 

* 3:jsonpnginx

原理:前端先將一個實現定義好的函數名放給服務端,服務端接受這個函數,而後拼接 ‘(參數)’返回到瀏覽器。ajax

他是一個先後端配合的結果。json

可是有些網站不是公開的數據,並不知道他的已經定義好的函數名是什麼後端

 1 <script src="js/jquery.min.js"></script>
 2 <script>
 3     $.ajax({
 4         type:'get',
 5         url:'http://api.study.com/jquery_jsonp.php',
 6         dataType:'jsonp',
 7         success:function(data){
 8             console.log(data);
 9         }
10     });
11 </script>

 

* 4:頂級域名相同時的跨域問題,能夠使用這些方式

  (1)document.domain + iframe

"http://aaa.kuayu.com/" 中的文件能夠在JavaScript中,使用top關鍵字訪問到它的上一級元素(也就是引入他的b文件)中的元素。此時頁面顯示的效果是b文件中的p段落變爲黃色

          

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Document</title>
 6     <style>
 7         body {
 8             color: red;
 9         }
10     </style>
11 </head>
12 <body>
13     aaaaaaaaaaa
14 </body>
15 </html>
16 <script>
17     document.domain = 'kuayu.com';
18     top.document.getElementsByTagName('p')[0].style.color = 'yellow';
19 </script>
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Document</title>    
 6     <style>
 7         body {
 8             color: green;
 9         }
10     </style>
11 </head>
12 <body>
13 <p>bbbbbbbbbbbb</p>
14 
15  <iframe src="http://aaa.kuayu.com/" frameborder="0"></iframe>
16     
17 </body>
18 </html>
19 
20 <script>
21     
22     document.domain = 'kuayu.com';
23 </script>

 

  (2)domain.name = 頂級域名

  (3)document.name + iframe

實現思路:給a頁面添加一個全局屬性name;

在b頁面引入a頁面,而且在iframe加載完畢以後修改他的url,是他引入一個本地的頁面。

此時在b頁面經過iframe.contentWindow.name獲取的就是a頁面的數據

 1 <script>
 2 var iframe = document.querySelector('iframe');
 3 iframe.contentWindow.name = 111;
 4 iframe.onload = function(){
 5     this.src = 'c.html';
 6     this.onload = null;
 7 }
 8 
 9 setTimeout(function(){
10         var name = iframe.contentWindow.name;
11     alert(name);
12 },200);
13 
14 
15 </script>
1 <script>
2 window.name='a頁面的數據'
3 </script>

 

  (4)document.hash + iframe

    hash也就是錨點

    能夠經過hash傳遞數據

1 <body>
2 <p>bbbbbbbbbbbb</p>
3 
4  <iframe src="http://aaa.kuayu.com/#name=hahaha" frameborder="0"></iframe>
5   //  此時hash值name=hahaha 能夠傳遞到a頁面,也就是在按頁面能夠取到b頁面傳遞給她的值。使用這是種方式能夠實現數據的跨域傳遞。
6 </body>

 

  (5)window.postMessage()

 

5: 在服務器實現跨域的方法(反向代理)

以Apache的配置爲例

1:修改Apache的配置文件
    #LoadModule proxy_module modules/mod_proxy.so
      LoadModule proxy_http_module modules/mod_proxy_http.so
      放開註釋
2: 修改httpd-vhosts.conf文件,給本身的項目 添加兩行 ProxyRequests Off 開啓反向代理 ProxyPass /api http://api.botue.com 起一個別名

 

6:服務端 實現反向代理 (與服務器不一樣)

    

1 <?php
2     header('Content-Type : application/json');    
3 
4     $result = file_get_contents( '跨域的地址' );
5 
6     echo $result;
7 ?>

在頁面使用XMLHTTPRequest發送請求,能夠獲取php後臺返回出去的跨域的數據

 

 

7:在瀏覽器安裝cors插件。。。

  此方法僅適合在本身的電腦上玩。。啊哈哈哈哈

 

--------------------------------------------------------------------------------------------------------------

5月27日補充:

因爲最近工做遇到跨域解決方案,特意回來補充一下

 8:使用nginx作反向代理。

 9:charles代理工具也能夠實現跨域請求數據。(ubantu系統下面)charles的安裝方法:http://www.cnblogs.com/summer0319/p/6904163.html

————————————————————————

固然,解決跨域問題還有其餘的方法,之後學到了在補充。

以上內容僅僅用來總結記錄,有不正確的地方望多指教,互相學習^_^

相關文章
相關標籤/搜索