方法一:jsonp函數javascript
在HTML DOM中,Script標籤是能夠跨域訪問服務器上的數據的.所以,能夠指定script的src屬性爲跨域的url,基於script標籤實現跨域.
script標籤自己就能夠訪問其它域的資源,不受瀏覽器同源策略的限制,能夠經過在頁面動態建立script標籤。html
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」})java
服務端:jquery
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
$.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"})
此時就實現了跨域範文數據的要求.json
方法二: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>
頁面二瀏覽器
<html> <head> <script> document.domain = "xx.com"; function b(){ alert("test from b"); } </script> </head> <body> </body> </html>
這時候父頁面就能夠調用子頁面的b函數,實現js跨域訪問服務器
方法三:後臺代理方式
這種方式能夠解決全部跨域問題,也就是將後臺做爲代理,每次對其它域的請求轉交給本域的後臺,本域的後臺經過模擬http請求去訪問其它域,再將返回的結果返回給前臺,這樣作的好處是,不管訪問的是文檔,仍是js文件均可以實現跨域app
參考 IIS反向代理