最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript跨域方法匯總

 更新時間:2014年10月16日 08:43:48   作者:四火  
這篇文章主要介紹了JavaScript跨域方法匯總,本文總結(jié)了12種JavaScript的跨域方法,需要的朋友可以參考下

做Web開發(fā)經(jīng)常需要面對跨域問題,跨域問題的根源是瀏覽器安全中的同源策略,比如說,對于http://www.a.com/1.html來說:

1.http://www.a.com/2.html是同源的;
2.https://www.a.com/2.html是不同源的,原因是協(xié)議不同;
3.http://www.a.com:8080/2.html是不同源的,原因是端口不同;
4.http://sub.a.com/2.html是不同源的,原因是主機不同。

在瀏覽器中,<script>、<img>、<iframe>和<link>這幾個標(biāo)簽是可以加載跨域(非同源)的資源的,并且加載的方式其實相當(dāng)于一次普通的GET請求,唯一不同的是,為了安全起見,瀏覽器不允許這種方式下對加載到的資源的讀寫操作,而只能使用標(biāo)簽本身應(yīng)當(dāng)具備的能力(比如腳本執(zhí)行、樣式應(yīng)用等等)。

最常見的跨域問題是Ajax跨域訪問的問題,默認情況下,跨域的URL是無法通過Ajax訪問的。這里我記錄我所了解到的跨域的方法:

1. 服務(wù)器端代理,這沒有什么可說的,缺點在于,默認情況下接收Ajax請求的服務(wù)端是無法獲取到的客戶端的IP和UA的。

2. iframe,使用iframe其實相當(dāng)于開了一個新的網(wǎng)頁,具體跨域的方法大致是,域A打開的母頁面嵌套一個指向域B的iframe,然后提交數(shù)據(jù),完成之后,B的服務(wù)端可以:

●返回一個302重定向響應(yīng),把結(jié)果重新指回A域;
●在此iframe內(nèi)部再嵌套一個指向A域的iframe。

這兩者都最終實現(xiàn)了跨域的調(diào)用,這個方法功能上要比下面介紹到的JSONP更強,因為跨域完畢之后DOM操作和互相之間的JavaScript調(diào)用都是沒有問題的,但是也有一些限制,比如結(jié)果要以URL參數(shù)傳遞,這就意味著在結(jié)果數(shù)據(jù)量很大的時候需要分割傳遞,甚是麻煩;還有一個麻煩是iframe本身帶來的,母頁面和iframe本身的交互本身就有安全性限制。

3. 利用script標(biāo)簽跨域,這個辦法也很常見,script標(biāo)簽是可以加載異域的JavaScript并執(zhí)行的,通過預(yù)先設(shè)定好的callback函數(shù)來實現(xiàn)和母頁面的交互。它有一個大名,叫做JSONP跨域,JSONP是JSON with Padding的略稱。它是一個非官方的協(xié)議,明明是加載script,為啥和JSON扯上關(guān)系呢?原來就是這個callback函數(shù),對它的使用有一個典型的方式,就是通過JSON來傳參,即將JSON數(shù)據(jù)填充進回調(diào)函數(shù),這就是JSONP的JSON+Padding的含義。

在互聯(lián)網(wǎng)上有很多JSONP的服務(wù)來提供數(shù)據(jù),本質(zhì)上就是跨域請求,并且在請求URL中指定好callback,比如callback=result,那么在獲取到這些數(shù)據(jù)以后,就會自動調(diào)用result函數(shù),并且把這些數(shù)據(jù)以JSON的形式傳進去,例如(搜索“football”):

http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=football&callback=result

使用JQuery來調(diào)用就寫成:

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

$.getJSON("http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=football&callback=?",function(data){
    //...
});

總的來說,JSONP的跨域方式的局限性在于,只能使用GET請求,并且不能解決不同域的兩個頁面之間如何進行JavaScript調(diào)用的問題。

4. Flash跨域:

它會訪問目標(biāo)網(wǎng)站根目錄下面的crossdomain.xml文件,根據(jù)文件中的內(nèi)容來確定是否允許此次跨域訪問:

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

<cross-domain-policy>
    <allow-access-from domain="xxx.xxx.com" />
</cross-domain-policy>

5. img標(biāo)簽也可以使用,這也是一種非常常見的方法,功能上面弱一點,只能發(fā)送一個get請求,沒有什么回調(diào),Google的點擊計數(shù)就是這樣確定的。

6. window.PostMessage,這個算是HTML5新加入的為跨域通訊考慮的機制,只有Firefox 3、Safari 4和IE8及之后的版本支持。使用它向其它窗口發(fā)送消息的調(diào)用方式如下:

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

otherWindow.postMessage(message, targetOrigin);

在接收的窗口,需要設(shè)置一個事件處理函數(shù)來接收發(fā)過來的消息:
復(fù)制代碼 代碼如下:

window.addEventListener("message", receiveMessage, false);
function receiveMessage(event){
    if (event.origin !== "http://example.org:8080")
        return;
}

注意這里必需要使用消息的origin和source屬性來驗證發(fā)送者的身份,否則會造成XSS漏洞。

7. Access Control

有一些瀏覽器支持Access-Control-Allow-Origin這樣的響應(yīng)頭,比如:

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

header("Access-Control-Allow-Origin: http://www.a.com");

就指定了允許對www.a.com跨域訪問。

8. window.name

這個東西其實以前被用作黑客XSS的手段,其本質(zhì)是,當(dāng)window的location變化的時候,頁面會重新加載,但是有趣的是,這個window.name居然不發(fā)生變化,那么就可以用它來傳值了。配合iframe,改變幾次iframe的window對象,就完成了實用的跨域數(shù)據(jù)傳遞。

9. document.domain

這個方式適用于a.example.com和b.example.com這種跨域的通信,因為二者有一個共有的域,叫做example.com,只要設(shè)置document.domain為example.com就可以了,但是如果a.example1.com和b.example2.com之間要通信,它就沒辦法了。

10. Fragment Identitier Messaging(FIM)

這個方法很有意思,也需要iframe的配合。Fragment Identitier就是URL的井號(#)后面的經(jīng)常用于錨點定位的部分,這部分的改變不會導(dǎo)致頁面刷新,母窗口可以隨便訪問iframe的URL,而iframe也可以隨便訪問母窗口的URL,那這二者之間就可以通過改變Fragmement Identitier來實現(xiàn)通信了。缺點是Fragmement Identitier的改變會產(chǎn)生不必要的歷史記錄,而且也有長度限制;另外,有的瀏覽器不支持onhashchange事件。

11. Cross Frame(CF)

這種方法是上述FIM方法的變種,CF和FIM的本質(zhì)其實在我的《GWT初體驗》這篇文章里面都有介紹(只不過是被用來實現(xiàn)歷史和后退功能了),它會動態(tài)創(chuàng)建一個不可見的iframe,指向異域,處理完以后,這個iframe的URL中的Fragment Identitier包含了處理結(jié)果,供母頁面訪問,而瀏覽器的URL沒有任何變化。

12. Cookie+P3P協(xié)議

利用P3P協(xié)議下跨域訪問Cookie的特性,來實現(xiàn)跨域訪問,也算一奇招。P3P是W3C公布的一項隱私保護推薦標(biāo)準(zhǔn),旨在為網(wǎng)上沖浪的Internet用戶提供隱私保護。把Cookie的path設(shè)置為“/”,即沒有任何域的限制,這個時候有的瀏覽器下面允許別的URL的頁面來讀取,有的則不允許,這種情況下需要在母頁面響應(yīng)的頭上面設(shè)置P3P的頭:

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

P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"

相關(guān)文章

  • Vue 組件渲染詳情

    Vue 組件渲染詳情

    這篇文章主要介紹了Vue 組件渲染詳情,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • JavaScript設(shè)計模式之抽象工廠模式介紹

    JavaScript設(shè)計模式之抽象工廠模式介紹

    這篇文章主要介紹了JavaScript設(shè)計模式之抽象工廠模式介紹,抽象工廠模式就是對功能類單獨創(chuàng)建工廠類,這樣就不必修改之前的代碼,又擴展了功能,需要的朋友可以參考下
    2014-12-12
  • JS給Textarea文本框添加行號的方法

    JS給Textarea文本框添加行號的方法

    這篇文章主要介紹了JS給Textarea文本框添加行號的方法,涉及javascript針對頁面元素結(jié)點的讀取與判定技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • JavaScript實現(xiàn)復(fù)制或剪切內(nèi)容到剪貼板功能的方法

    JavaScript實現(xiàn)復(fù)制或剪切內(nèi)容到剪貼板功能的方法

    這篇文章主要介紹了JavaScript實現(xiàn)復(fù)制或剪切內(nèi)容到剪貼板功能的方法,我們平時看到的網(wǎng)頁上很多一鍵復(fù)制功能就是如此實現(xiàn),需要的朋友可以參考下
    2016-05-05
  • 深入理解javascript原型鏈和繼承

    深入理解javascript原型鏈和繼承

    這篇文章主要介紹了javascript原型鏈和繼承的概念,以及使用原型鏈實現(xiàn)繼承、經(jīng)典繼承、組合式繼承、寄生組合式繼承。非常實用,是篇非常不錯的文章,這里推薦給大家。
    2014-09-09
  • 微信小程序?qū)崿F(xiàn)選擇地址省市區(qū)三級聯(lián)動

    微信小程序?qū)崿F(xiàn)選擇地址省市區(qū)三級聯(lián)動

    這篇文章主要為大家詳細介紹了微信小程序?qū)崿F(xiàn)選擇地址省市區(qū)三級聯(lián)動,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • js判斷是否為空和typeof的用法(詳解)

    js判斷是否為空和typeof的用法(詳解)

    下面小編就為大家?guī)硪黄猨s判斷是否為空和typeof的用法(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • ajax前臺后臺跨域請求處理方式

    ajax前臺后臺跨域請求處理方式

    本篇文章通過前臺跨域請求處理以及后臺跨域的數(shù)據(jù)處理方式介紹,詳細分析了ajax跨域的問題,對此有需要的朋友學(xué)習(xí)下。
    2018-02-02
  • js中function()使用方法

    js中function()使用方法

    通過函數(shù)對象的性質(zhì),可以很方便的將一個函數(shù)賦值給一個變量或者將函數(shù)作為參數(shù)傳遞,下面為大家介紹下函數(shù)的使用語法
    2013-12-12
  • Bootstrap常用組件學(xué)習(xí)(整理)

    Bootstrap常用組件學(xué)習(xí)(整理)

    這篇文章是小編日常收集整理的有關(guān)bootstrap?常用組件包括Bootstrap?面板(Panels),Bootstrap?多媒體對象(Media?Object)知識,非常不錯,需要的朋友參考下吧
    2017-03-03

最新評論

谢通门县| 融水| 贵州省| 陕西省| 温泉县| 台南市| 金溪县| 洛宁县| 巴塘县| 建瓯市| 新化县| 怀柔区| 丰镇市| 马鞍山市| 平武县| 太白县| 蕲春县| 武川县| 梓潼县| 酉阳| 将乐县| 紫云| 万载县| 读书| 四子王旗| 绵阳市| 区。| 达尔| 博罗县| 黔西县| 徐州市| 修水县| 美姑县| 三亚市| 青岛市| 五华县| 松溪县| 土默特右旗| 浠水县| 偃师市| 天峨县|