欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JS跨域問題詳解

 更新時間:2014年11月25日 10:49:05   投稿:hebedich  
本文結(jié)合實際,分兩種情況討論跨域技術(shù):首先討論不同子域的跨域技術(shù),然后討論完全不同域的跨域技術(shù)。有需要的小伙伴可要看仔細了。

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

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

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

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

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

先來解決第一個問題,假設(shè)example.com域下有兩個不同子域:abc.example.com和def.example.com。現(xiàn)在假設(shè)在def.example.com下面有一個頁面,里面定義了一個JavaScript函數(shù):

復(fù)制代碼 代碼如下:

function funcInDef() {
   .....
}

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

復(fù)制代碼 代碼如下:

window.top.funcInDef();

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

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

復(fù)制代碼 代碼如下:

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


  這樣,兩個頁面就變?yōu)橥蛄?,前面的調(diào)用也可以正常執(zhí)行了。

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

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

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

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

復(fù)制代碼 代碼如下:

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系列瀏覽器。每次我們調(diào)用newRequest函數(shù),就獲得了一個剛剛創(chuàng)建的Ajax對象,然后用這個Ajax對象來發(fā)送HTTP請求。例如,下面的代碼向abc.example.com發(fā)送了一個GET請求:

復(fù)制代碼 代碼如下:

var request = newRequest();
request.open("GET", " request.send(null);

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

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

復(fù)制代碼 代碼如下:

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

[code]
<iframe name="xd_iframe" style="display:none" src=">

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

復(fù)制代碼 代碼如下:

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

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

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

  在講解不同域的跨域技術(shù)之前,我們首先明確一點,下面要講的技術(shù)也同樣適用于前面跨不同子域的情況,因為跨不同子域只是跨域問題的一個特例。當(dāng)然,在恰當(dāng)?shù)那闆r下使用恰當(dāng)?shù)募夹g(shù),能夠保證更優(yōu)的效率和更高的穩(wěn)定性。

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

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

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

相關(guān)文章

  • JavaScript中的事件循環(huán)方式

    JavaScript中的事件循環(huán)方式

    這篇文章主要介紹了JavaScript中的事件循環(huán)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • JS中Object對象的原型概念基礎(chǔ)

    JS中Object對象的原型概念基礎(chǔ)

    本篇文章是一篇關(guān)于JS學(xué)習(xí)的基礎(chǔ)內(nèi)容,學(xué)習(xí)Object對象的原型概念,有興趣的朋友參考下吧。
    2018-01-01
  • javascript數(shù)組里的27個方法總合詳解

    javascript數(shù)組里的27個方法總合詳解

    這篇文章主要為大家詳細介紹了javascript數(shù)組里的方法27個總合,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • JavaScript中Number.MIN_VALUE屬性的使用示例

    JavaScript中Number.MIN_VALUE屬性的使用示例

    這篇文章主要介紹了JavaScript中Number.MIN_VALUE屬性的使用示例,是JS入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-06-06
  • 淺談JavaScript字符集

    淺談JavaScript字符集

    這篇文章主要介紹了JavaScript字符集,需要的朋友可以參考下
    2014-05-05
  • JavaScript之編碼規(guī)范 推薦

    JavaScript之編碼規(guī)范 推薦

    JavaScript是一種語法靈活,簡單易懂的腳本語言。正因為靈活,因此很多人在編寫代碼時,顯得很隨意,這就導(dǎo)致后期的修改、擴展和維護變得異常困難。遵循統(tǒng)一的編碼規(guī)范,不僅對C++和Java這種編譯型語言很重要,對JavaScript腳本語言也同樣如此
    2012-05-05
  • 前端面試題及答案整理(二)

    前端面試題及答案整理(二)

    上一篇從常見數(shù)據(jù)結(jié)構(gòu)算法、JavaScript兩個方面從面試的角度進行了整理,本文將對其余內(nèi)容進行補充
    2016-08-08
  • JavaScript italics方法入門實例(把字符串顯示為斜體)

    JavaScript italics方法入門實例(把字符串顯示為斜體)

    這篇文章主要介紹了JavaScript italics方法入門實例,italics方法用于把字符串顯示為斜體,需要的朋友可以參考下
    2014-10-10
  • JavaScript 學(xué)習(xí)筆記(十四) 正則表達式

    JavaScript 學(xué)習(xí)筆記(十四) 正則表達式

    RegExp類 RegExp對象的構(gòu)造函數(shù)可以帶一個或兩個參數(shù) 第一個參數(shù)是描述需要進行匹配的模式字符串,如果還有第二個參數(shù),這個參數(shù)則制定了額外的處理指令。
    2010-01-01
  • JavaScript自定義函數(shù)用法詳解

    JavaScript自定義函數(shù)用法詳解

    本文詳細講解了JavaScript自定義函數(shù)的用法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03

最新評論