亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

js跨域問題淺析及解決方法優缺點對比

2024-05-06 16:10:30
字體:
來源:轉載
供稿:網友
所謂js跨域問題,是指在一個域下的頁面中通過js訪問另一個不同域下 的數據對象,出于安全性考 慮,幾乎所有瀏覽器都不允許這種跨域訪問,這就導致在一些ajax應用中,使用跨域的web service會成為一個問題。 要解決跨域的問題,就是本文我們需要探討的了
 
 

什么是跨域?

概念:只要協議、域名、端口有任何一個不同,都被當作是不同的域。

 

復制代碼代碼如下:

URL                      說明       是否允許通信
http://www.a.com/a.js
http://www.a.com/b.js 同一域名下 允許
http://www.a.com/lab/a.js
http://www.a.com/script/b.js 同一域名下不同文件夾 允許
http://www.a.com:8000/a.js
http://www.a.com/b.js 同一域名,不同端口 不允許
http://www.a.com/a.js
https://www.a.com/b.js 同一域名,不同協議 不允許
http://www.a.com/a.js
http://70.32.92.74/b.js 域名和域名對應ip 不允許
http://www.a.com/a.js
http://script.a.com/b.js 主域相同,子域不同 不允許
http://www.a.com/a.js
http://a.com/b.js 同一域名,不同二級域名(同上) 不允許(cookie這種情況下也不允許訪問)
http://www.cnblogs.com/a.js
http://www.a.com/b.js 不同域名 不允許

 

對于端口和協議的不同,只能通過后臺來解決。

跨域資源共享(CORS)

CROS(Cross-Origin Resource Sharing)跨域資源共享,定義了必須在訪問跨域資源時,瀏覽器與服務器應該如何溝通。CROS背后的基本思想就是使用自定義的HTTP頭部讓瀏覽器與服務器進行溝通,從而決定請求或響應是應該成功還是失敗。

 

復制代碼代碼如下:

<script type="text/javascript">
    var xhr = new XMLHttpRequest();
    xhr.open("?GET", "/trigkit4",true);
    xhr.send();
</script>

 

以上的trigkit4是相對路徑,如果我們要使用CORS,相關Ajax代碼可能如下所示:

 

復制代碼代碼如下:

<script type="text/javascript">
    var xhr = new XMLHttpRequest();
    xhr.open("?GET", "http://segmentfault.com/u/trigkit4/",true);
    xhr.send();
</script>

 

代碼與之前的區別就在于相對路徑換成了其他域的絕對路徑,也就是你要跨域訪問的接口地址。

服務器端對于CORS的支持,主要就是通過設置Access-Control-Allow-Origin來進行的。如果瀏覽器檢測到相應的設置,就可以允許Ajax進行跨域的訪問。

要解決跨域的問題,我們可以使用以下幾種方法:

通過jsonp跨域

現在問題來了?什么是jsonp?維基百科的定義是:JSONP(JSON with Padding)是資料格式 JSON 的一種“使用模式”,可以讓網頁從別的網域要資料。

JSONP也叫填充式JSON,是應用JSON的一種新方法,只不過是被包含在函數調用中的JSON,例如:

 

復制代碼代碼如下:

callback({"name","trigkit4"});

 

JSONP由兩部分組成:回調函數和數據?;卣{函數是當響應到來時應該在頁面中調用的函數,而數據就是傳入回調函數中的JSON數據。

在js中,我們直接用XMLHttpRequest請求不同域上的數據時,是不可以的。但是,在頁面上引入不同域上的js腳本文件卻是可以的,jsonp正是利用這個特性來實現的。 例如:

 

復制代碼代碼如下:

<script type="text/javascript">
    function dosomething(jsondata){
        //處理獲得的json數據
    }
</script>
<script src="http://example.com/data.php?callback=dosomething"></script>

 

js文件載入成功后會執行我們在url參數中指定的函數,并且會把我們需要的json數據作為參數傳入。所以jsonp是需要服務器端的頁面進行相應的配合的。

 

復制代碼代碼如下:

<?php
$callback = $_GET['callback'];//得到回調函數名
$data = array('a','b','c');//要返回的數據
echo $callback.'('.json_encode($data).')';//輸出
?>

 

最終,輸出結果為:dosomething(['a','b','c']);

如果你的頁面使用jquery,那么通過它封裝的方法就能很方便的來進行jsonp操作了。

 

復制代碼代碼如下:

<script type="text/javascript">
    $.getJSON('http://example.com/data.php?callback=?,function(jsondata)'){
        //處理獲得的json數據
    });
</script>

 

jquery會自動生成一個全局函數來替換callback=?中的問號,之后獲取到數據后又會自動銷毀,實際上就是起一個臨時代理函數的作用。$.getJSON方法會自動判斷是否跨域,不跨域的話,就調用普通的ajax方法;跨域的話,則會以異步加載js文件的形式來調用jsonp的回調函數。

JSONP的優缺點

JSONP的優點是:它不像XMLHttpRequest對象實現的Ajax請求那樣受到同源策略的限制;它的兼容性更好,在更加古老的瀏覽器中都可以運行,不需要XMLHttpRequest或ActiveX的支持;并且在請求完畢后可以通過調用callback的方式回傳結果。

JSONP的缺點則是:它只支持GET請求而不支持POST等其它類型的HTTP請求;它只支持跨域HTTP請求這種情況,不能解決不同域的兩個頁面之間如何進行JavaScript調用的問題。

CROS和JSONP對比

CORS與JSONP相比,無疑更為先進、方便和可靠。

    1、 JSONP只能實現GET請求,而CORS支持所有類型的HTTP請求。

    2、 使用CORS,開發者可以使用普通的XMLHttpRequest發起請求和獲得數據,比起JSONP有更好的錯誤處理。

    3、 JSONP主要被老的瀏覽器支持,它們往往不支持CORS,而絕大多數現代瀏覽器都已經支持了CORS)。
通過修改document.domain來跨子域

瀏覽器都有一個同源策略,其限制之一就是第一種方法中我們說的不能通過ajax的方法去請求不同源中的文檔。 它的第二個限制是瀏覽器中不同域的框架之間是不能進行js的交互操作的。
不同的框架之間是可以獲取window對象的,但卻無法獲取相應的屬性和方法。比如,有一個頁面,它的地址是http://www.example.com/a.html , 在這個頁面里面有一個iframe,它的src是http://example.com/b.html, 很顯然,這個頁面與它里面的iframe框架是不同域的,所以我們是無法通過在頁面中書寫js代碼來獲取iframe中的東西的:

 

復制代碼代碼如下:

<script type="text/javascript">
    function test(){
        var iframe = document.getElementById('?ifame');
        var win = document.contentWindow;//可以獲取到iframe里的window對象,但該window對象的屬性和方法幾乎是不可用的
        var doc = win.document;//這里獲取不到iframe里的document對象
        var name = win.name;//這里同樣獲取不到window對象的name屬性
    }
</script>
<iframe id = "iframe" src="http://example.com/b.html" onload = "test()"></iframe>

 

這個時候,document.domain就可以派上用場了,我們只要把http://www.example.com/a.html 和 http://example.com/b.html這兩個頁面的document.domain都設成相同的域名就可以了。但要注意的是,document.domain的設置是有限制的,我們只能把document.domain設置成自身或更高一級的父域,且主域必須相同。

1.在頁面 http://www.example.com/a.html 中設置document.domain:

 

復制代碼代碼如下:

<iframe id = "iframe" src="http://example.com/b.html" onload = "test()"></iframe>
<script type="text/javascript">
    document.domain = 'example.com';//設置成主域
    function test(){
        alert(document.getElementById('?iframe').contentWindow);//contentWindow 可取得子窗口的 window 對象
    }
</script>

2.在頁面 http://example.com/b.html 中也設置document.domain:

 

 

復制代碼代碼如下:

<script type="text/javascript">
    document.domain = 'example.com';//在iframe載入這個頁面也設置document.domain,使之與主頁面的document.domain相同
</script>

 

修改document.domain的方法只適用于不同子域的框架間的交互。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品日韩欧美| 欧美视频一区二区三区…| 久操成人在线视频| 国产精品自产拍在线观看| 国产欧美一区二区三区久久| 国产精品自产拍高潮在线观看| 久久精品国产亚洲精品2020| 国产精品91一区| 亚洲深夜福利网站| 欧美超级免费视 在线| 亚洲人成电影网| 欧美精品videossex88| 亚洲欧美成人一区二区在线电影| 久久综合久久美利坚合众国| 色偷偷av一区二区三区| 精品亚洲夜色av98在线观看| 日韩欧美亚洲国产一区| 久久久这里只有精品视频| 2019中文字幕在线免费观看| 国产精品扒开腿做| 欧美有码在线观看| 欧美又大又硬又粗bbbbb| 久久青草精品视频免费观看| 8x海外华人永久免费日韩内陆视频| 久久在精品线影院精品国产| 成人免费激情视频| 午夜精品福利在线观看| 7m第一福利500精品视频| 亚洲男人第一av网站| 国产精品视频精品视频| 久久免费视频在线观看| 91极品视频在线| 日本精品久久中文字幕佐佐木| 国产91成人video| 美女久久久久久久久久久| 91精品国产综合久久男男| 91在线视频导航| 亚洲国产97在线精品一区| 亚洲精品免费网站| 日韩成人av在线播放| 久久国产精品久久久久| 96pao国产成视频永久免费| 亚洲精品第一页| 精品久久久久久久久久| 亚洲一区二区在线| 亚洲综合在线做性| 亚洲日本欧美日韩高观看| 久久精品国产精品| 日韩欧美国产中文字幕| 欧美高清不卡在线| 久久精品国产亚洲精品| 韩国三级日本三级少妇99| 欧美国产视频一区二区| 欧美色视频日本高清在线观看| 97超碰国产精品女人人人爽| 91在线视频免费| 国产精品中文字幕在线| 91在线观看免费高清完整版在线观看| 国产99久久久欧美黑人| 狠狠色狠狠色综合日日五| 亚洲国产中文字幕久久网| 欧美猛交ⅹxxx乱大交视频| 欧美成人精品h版在线观看| 欧美高清在线观看| 国产精品一香蕉国产线看观看| 久久视频在线看| 欧美日韩午夜视频在线观看| 色在人av网站天堂精品| 久久国产精品久久久| 91久久国产精品91久久性色| 精品美女永久免费视频| 国产乱肥老妇国产一区二| 日韩精品中文在线观看| 欧美激情高清视频| 免费av一区二区| 国产精品丝袜久久久久久不卡| 成人免费看片视频| 欧美性jizz18性欧美| 日韩av片免费在线观看| 中文字幕不卡在线视频极品| 亚洲片av在线| 欧美视频二区36p| 在线成人激情视频| 亚洲毛片在线观看.| 精品国产乱码久久久久久婷婷| 亚洲福利影片在线| 色黄久久久久久| 日韩欧美成人免费视频| 亚洲日韩欧美视频| 欧美另类交人妖| 国产欧美韩国高清| 国产精品成久久久久三级| 日韩人在线观看| 伊人男人综合视频网| 欧美性xxxxx极品| 2018国产精品视频| 国产精品白丝av嫩草影院| 疯狂做受xxxx高潮欧美日本| 亚洲欧美日韩在线一区| 亚洲精品91美女久久久久久久| 久久手机精品视频| 国产成人一区二区三区小说| 高清亚洲成在人网站天堂| 久久久久久国产精品久久| 国产主播精品在线| 国产精品免费久久久| 日韩av在线网站| 九色91av视频| 国产精品亚洲片夜色在线| 欧美日韩国产二区| 午夜精品久久久久久久99黑人| 68精品国产免费久久久久久婷婷| 欧美性videos高清精品| 亚洲国产中文字幕在线观看| 国产亚洲欧美aaaa| 亚洲情综合五月天| 在线精品视频视频中文字幕| 亚洲欧美日韩成人| 日韩中文在线中文网三级| 日韩欧美中文第一页| 91精品国产综合久久男男| 国产精品入口福利| 国产一区二区精品丝袜| 欧美孕妇孕交黑巨大网站| 亚洲精品中文字幕女同| 久久国内精品一国内精品| 亚洲性日韩精品一区二区| 国产精品旅馆在线| 成人美女av在线直播| 成人性教育视频在线观看| 色yeye香蕉凹凸一区二区av| 久久久久成人网| 国模叶桐国产精品一区| 欧美电影在线免费观看网站| 精品久久久久久久久久ntr影视| 精品久久久久久久久久久久| 久久久久久久影院| 毛片精品免费在线观看| 国产精品美女久久久免费| 3344国产精品免费看| 国产免费成人av| 午夜精品一区二区三区av| 欧美精品videosex牲欧美| 亚洲а∨天堂久久精品9966| 国产精品成人国产乱一区| 亚洲综合成人婷婷小说| xxx欧美精品| 欧美日韩一区二区免费视频| 一个人看的www久久| 亚洲日韩中文字幕| 亚洲最大福利网站| 国内精品视频久久| 亚洲成人精品在线| 国产精品久久久久久搜索| 91av网站在线播放| 91成人在线观看国产| 亚洲福利视频免费观看| 亚洲男女性事视频| 欧美日韩国产色视频| 永久555www成人免费| 91国产一区在线| 久久久久久久国产精品视频| 亚洲福利视频二区| 久久精品中文字幕电影|