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

首頁 > 語言 > JavaScript > 正文

JS跨域問題詳解

2024-05-06 16:11:00
字體:
來源:轉載
供稿:網友
本文結合實際,分兩種情況討論跨域技術:首先討論不同子域的跨域技術,然后討論完全不同域的跨域技術。有需要的小伙伴可要看仔細了。
 
 

JavaScript是一種在Web開發中經常使用的前端動態腳本技術。在JavaScript中,有一個很重要的安全性限制,被稱為“Same-Origin Policy”(同源策略)。這一策略對于JavaScript代碼能夠訪問的頁面內容做了很重要的限制,即JavaScript只能訪問與包含它的文檔在同一域下的內容。

  JavaScript這個安全策略在進行多iframe或多窗口編程、以及Ajax編程時顯得尤為重要。根據這個策略,在baidu.com下的頁面中包含的JavaScript代碼,不能訪問在google.com域名下的頁面內容;甚至不同的子域名之間的頁面也不能通過JavaScript代碼互相訪問。對于Ajax的影響在于,通過XMLHttpRequest實現的Ajax請求,不能向不同的域提交請求,例如,在abc.example.com下的頁面,不能向def.example.com提交Ajax請求,等等。

  然而,當進行一些比較深入的前端編程的時候,不可避免地需要進行跨域操作,這時候“同源策略”就顯得過于苛刻。本文就這個問題,概括了跨域所需要的一些技術。

  下面我們分兩種情況討論跨域技術:首先討論不同子域的跨域技術,然后討論完全不同域的跨域技術。

(一)不同子域的跨域技術。
  我們分兩個問題來分別討論:第一個問題是如何跨不同子域進行JavaScript調用;第二個問題是如何向不同子域提交Ajax請求。

先來解決第一個問題,假設example.com域下有兩個不同子域:abc.example.com和def.example.com?,F在假設在def.example.com下面有一個頁面,里面定義了一個JavaScript函數:

 

復制代碼代碼如下:

function funcInDef() {
   .....
}

 

  我們想在abc.example.com下的某個頁面里調用上面的函數。再假設我們要討論的abc.example.com下面的這個頁面是以iframe形式嵌入在def.example.com下面那個頁面里的,這樣我們可能試圖在iframe里做如下調用:

 

復制代碼代碼如下:

window.top.funcInDef();

 

   好,我們注意到,這個調用是被前面講到的“同源策略”所禁止的,JavaScript引擎會直接拋出一個異常。

  為了實現上述調用,我們可以通過修改兩個頁面的domain屬性的方法做到。例如,我們可以將上面在abc.example.com和def.example.com下的兩個頁面的頂端都加上如下的JavaScript代碼片段:

 

復制代碼代碼如下:

<script type="text/javascript">
    document.domain = "example.com";
</script> 

 


  這樣,兩個頁面就變為同域了,前面的調用也可以正常執行了。

  這里需要注意的一點是,一個頁面的document.domain屬性只能設置成一個更頂級的域名(除了一級域名),但不能設置成比當前域名更深層的子域名。例如,abc.example.com的頁面只能將它的domain設置成example.com,不能設置成sub.abc.example.com,當然也不能設置成一級域名com。

  上面的例子討論的是兩個頁面屬于iframe嵌套關系的情況,當兩個頁面是打開與被打開的關系時,原理也完全一樣。

  下面我們來解決第二個問題:如何向不同子域提交Ajax請求。

  通常情況下,我們會用與下面類似的代碼來創建一個XMLHttpRequest對象:

 

復制代碼代碼如下:

factories = [
    function() { return new XMLHttpRequest(); },
    function() { return new ActiveXObject("Msxml2.XMLHTTP"); },
    function() { return new ActiveXObject("Microsoft.XMLHTTP"); }
];
function newRequest() {
    for(var i = 0; i <</SPAN> factories.length; i++) {
        try{
            var factory = factories[i];
            return factory();
        } catch(e) {}
    }
    return null;

 

 

  上面的代碼中引用ActiveXObject,是為了兼容IE6系列瀏覽器。每次我們調用newRequest函數,就獲得了一個剛剛創建的Ajax對象,然后用這個Ajax對象來發送HTTP請求。例如,下面的代碼向abc.example.com發送了一個GET請求:

 

復制代碼代碼如下:

var request = newRequest();
request.open("GET", "http://abc.example.com" );
request.send(null);

 

  假設上面的代碼包含在一個abc.example.com域名下的頁面里,則這個GET請求可以正常發送成功,沒有任何問題。然而,如果現在要向def.example.com發送請求,則出現跨域問題,JavaScript引擎拋出異常。

  解決的辦法是,在def.example.com域下放置一個跨域文件,假設叫crossdomain.html;然后將前面的newRequest函數的定義移到這個跨域文件中;最后像之前修改document.domain值的做法一樣,在crossdomain.html文件和abc.example.com域下調用Ajax的頁面頂端,都加上:

 

復制代碼代碼如下:

<script type="text/javascript">
    document.domain = "example.com";
</script>
  為了使用跨域文件,我們在abc.example.com域下調用Ajax的頁面中嵌入一個隱藏的指向跨域文件的iframe,例如:

 

[code]
<iframe name="xd_iframe" style="display:none" src="http://def.example.com/crossdomain.html"></iframe>

 

  這時abc.example.com域下的頁面和跨域文件crossdomain.html都在同一個域(example.com)下,我們可以在abc.example.com域下的頁面中去調用crossdomain.html中的newRequest函數:

 

復制代碼代碼如下:

var request = window.frames["xd_iframe"].newRequest();

 

  這樣獲得的request對象,就可以向http://def.example.com發送HTTP請求了。

(二)完全不同域的跨域技術。
  如果頂級域名都不相同,例如example1.com和example2.com之間想通過JavaScript在前端通信,則所需要的技術更復雜些。

  在講解不同域的跨域技術之前,我們首先明確一點,下面要講的技術也同樣適用于前面跨不同子域的情況,因為跨不同子域只是跨域問題的一個特例。當然,在恰當的情況下使用恰當的技術,能夠保證更優的效率和更高的穩定性。

  簡言之,根據不同的跨域需求,跨域技術可以歸為下面幾類:

1、JSONP跨域GET請求
2、通過iframe實現跨域
3、flash跨域HTTP請求
4、window.postMessage

本文先到這里,后續我們再詳細介紹上面提到的4種跨域技術,稍后就奉上!


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

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧洲在线视频| 国产精品久久久久久一区二区| 久久天天躁狠狠躁夜夜爽蜜月| 自拍亚洲一区欧美另类| 中文字幕精品av| 成人啪啪免费看| 成人性生交xxxxx网站| 国产精品久久久久77777| 精品国产成人在线| 777777777亚洲妇女| 欧美精品做受xxx性少妇| www.精品av.com| 国产成人精彩在线视频九色| 国产精品亚洲第一区| 国产精品日韩av| 中文字幕亚洲无线码在线一区| 欧美电影电视剧在线观看| 亚洲国产天堂网精品网站| 亚洲成人动漫在线播放| 成人在线视频福利| 久久九九亚洲综合| 欧美激情中文字幕在线| 日韩av在线免播放器| 国产91精品久| 欧美色欧美亚洲高清在线视频| 午夜精品福利电影| 欧美亚洲第一页| 欧美日韩国产精品专区| 97视频人免费观看| 亚洲国产一区二区三区在线观看| 国产精品一区二区三区久久| 日韩一区二区三区国产| 成人黄色午夜影院| 中文字幕亚洲综合久久| 亚洲欧美日韩国产精品| 国产精品第1页| 精品欧美激情精品一区| 亚洲国产精品美女| 中文字幕欧美日韩精品| 精品福利在线观看| 午夜精品三级视频福利| 日本高清+成人网在线观看| 亚洲国产一区二区三区四区| 国产欧美精品日韩精品| 狠狠做深爱婷婷久久综合一区| 亚洲欧美日韩中文视频| 精品一区二区三区四区在线| 亚洲国产成人精品久久| 亚洲少妇激情视频| 欧美激情国产精品| 国产精品69久久| 国产福利精品av综合导导航| 一区二区三区视频免费在线观看| 欧美在线视频免费观看| 国产精品一区二区3区| 久久久久久69| 茄子视频成人在线| 在线观看国产精品日韩av| 国产区亚洲区欧美区| 色琪琪综合男人的天堂aⅴ视频| 欧美成人一区二区三区电影| 日本一本a高清免费不卡| 国产精品久久久久av免费| 亚洲天堂免费在线| 国产精品成人品| 欧美大片在线影院| 色综合男人天堂| 成人免费视频在线观看超级碰| 成年无码av片在线| 在线观看日韩欧美| 成人免费看片视频| 在线观看日韩视频| 欧美三级欧美成人高清www| 中文字幕亚洲欧美日韩在线不卡| 色老头一区二区三区在线观看| 激情懂色av一区av二区av| 成人深夜直播免费观看| 精品视频中文字幕| 久久视频免费在线播放| 国产91精品久| 国产午夜精品一区理论片飘花| 欧美片一区二区三区| 97视频在线观看播放| 日韩欧美一区二区在线| 日本道色综合久久影院| 欧美激情亚洲激情| 成人免费观看49www在线观看| 欧美刺激性大交免费视频| 久久影院模特热| 亚洲人成毛片在线播放| 91精品国产一区| 亚洲欧美资源在线| 欧美老女人性视频| 欧美极品少妇xxxxⅹ喷水| 亚洲自拍欧美色图| 日韩免费黄色av| 亚洲影视九九影院在线观看| 久久影院资源网| 国产精品视频久久久| 成人国产亚洲精品a区天堂华泰| 国产精品视频一区二区高潮| 久久久久久久久久久av| 亚洲精品久久久一区二区三区| 亚洲香蕉av在线一区二区三区| 欧美中文字幕在线视频| 国产精品久久久久av免费| 亚洲电影在线观看| 91欧美精品成人综合在线观看| 亚洲第一福利在线观看| 久久亚洲一区二区三区四区五区高| 国产噜噜噜噜噜久久久久久久久| 亚洲三级黄色在线观看| 91精品国产99| 黑人巨大精品欧美一区二区三区| 日韩精品在线视频美女| 国产一区二区成人| 欧美黄色片视频| 国产小视频91| 久久精品国产电影| 亚洲一区二区三区777| 亚洲精品欧美日韩| 国产极品jizzhd欧美| 日本高清视频一区| 美女少妇精品视频| 国产日本欧美在线观看| 奇米成人av国产一区二区三区| 国产乱人伦真实精品视频| 亚洲国产精品热久久| 国产精品狠色婷| 国产精品久久99久久| 精品香蕉一区二区三区| 国产精品一二三在线| 亚洲精品一区二区在线| 亚洲色图第一页| 国产美女被下药99| 国产成人精品a视频一区www| 午夜剧场成人观在线视频免费观看| 在线成人一区二区| 成人国产精品色哟哟| 一区二区欧美亚洲| 日韩欧美亚洲范冰冰与中字| 国产精品精品国产| 欧美一区二区三区……| 欧美中文在线观看国产| www.亚洲一区| 亚洲天堂网站在线观看视频| 午夜精品久久17c| 亚洲午夜色婷婷在线| 国产日韩在线亚洲字幕中文| 永久555www成人免费| 亚洲精品456在线播放狼人| 成人www视频在线观看| 日韩在线视频网站| 国产精品主播视频| 国产精品流白浆视频| 最近2019好看的中文字幕免费| 欧美成人亚洲成人日韩成人| xxxxx成人.com| 日韩电影免费在线观看中文字幕| 精品久久中文字幕久久av| 欧美精品生活片| 91亚洲国产成人精品性色| 成人国产精品一区二区| 国产精品亚洲一区二区三区|