js跨域原理及解決方案


方法一:jsonp函數

在HTML DOM中,Script標簽是可以跨域訪問服務器上的數據的.因此,可以指定script的src屬性為跨域的url,基於script標簽實現跨域.
script標簽本身就可以訪問其它域的資源,不受瀏覽器同源策略的限制,可以通過在頁面動態創建script標簽。

var script = document.createElement('script');  
script.src = "http://aa.xx.com/js/*.js";  
document.body.appendChild(script);  


這樣通過動態創建script標簽加載其它域的js文件,然后通過本頁面調用加載后js文件的函數,這樣做的缺陷是不能加載其它域的文檔,只能是js文件,jsonp便是通過這種方式實現的,jsonp通過向其它域傳入一個callback參數,通過其他域的后台將callback參數值和json串包裝成javascript函數返回,因為是通過script標簽發出的請求,瀏覽器會將返回來的字符串按照javascript進行解析執行,實現域與域的數據傳輸。
jquery中對jsonp的支持也是基於此方案。
例如:服務器返回的數據不能是單純的如{“Name”:”hofmann”}字符串,我們是沒有辦法引用這個字符串的.所以,要求返回的值是var json={“Name”:”zhangsan”},或json({“Name”:”zhangsan”})

服務端:

protected void retJSON()
{
    string callback = Request.QueryString["jsoncallback"];
    string result = callback + "({\"name\":\"hofmann\",\"date\":\"2019-05-08\"})";
    Response.Clear();
    Response.Write(result);
    Response.End();
}


客戶端代碼:

$.ajax({ 
    async: false, 
    url: "http://192.168.0.5/APi/Js", 
    type: "GET", 
    dataType: 'jsonp', 
    jsonp: 'jsoncallback', 
    data: null, 
    timeout: 5000, 
    contentType: "application/json;utf-8", 
    success: function (result) { 
        alert(result.date); 
    }, 
    error: function (jqXHR, textStatus, errorThrown) { 
        alert(textStatus); 
    } 
});


js向服務器發出了這樣一個請求:
http://192.168.0.5/APi/Js?jsoncallback=jsonp20190508
服務器返回對象:
jsonp20190508({"name":"hofmann","date":"2019-05-08"})
此時就實現了跨域范文數據的要求.


方法二:iframe實現跨域
基於iframe實現的跨域要求兩個域具有aa.xx.com,bb.xx.com這種特點,也就是兩個頁面必須屬於同一個頂級基礎域(例如都是xxx.com,或是xxx.com.cn),使用同一協議(例如都是 http)和同一端口(例如都是80),這樣在兩個頁面中同時添加document.domain,就可以實現父頁面調用子頁面的函數,代碼如下:
頁面一

<html>  
<head>  
  <script>  
   document.domain = "xx.com";  
    function a(){  
      alert("test");  
   }  
  </script>  
</head>  
<body>  
   <iframe src="http://192.168.0.5/APi/Frame2" id="frame1">  
     
   </iframe>  
   <script>  
  document.getElementById('frame1').onload = function(){  
     var d = document.getElementById('frame1').contentWindow;  
     d.b();  
       
 };  
   </script>  
 </body>  
</html>  
View Code

頁面二

<html>  
 <head>  
  <script>  
    document.domain = "xx.com";  
    function b(){  
        alert("test from b");  
     }  
  </script>  
 </head>  
 <body>  
 </body>  
</html>  

 

這時候父頁面就可以調用子頁面的b函數,實現js跨域訪問

方法三:后台代理方式
這種方式可以解決所有跨域問題,也就是將后台作為代理,每次對其它域的請求轉交給本域的后台,本域的后台通過模擬http請求去訪問其它域,再將返回的結果返回給前台,這樣做的好處是,無論訪問的是文檔,還是js文件都可以實現跨域

參考 IIS反向代理

 


免責聲明!

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



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