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

首頁 > 編程 > JavaScript > 正文

JavaScript跨域方法匯總

2019-11-20 14:02:28
字體:
來源:轉載
供稿:網友

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

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

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

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

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

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

●返回一個302重定向響應,把結果重新指回A域;
●在此iframe內部再嵌套一個指向A域的iframe。

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

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

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

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

使用JQuery來調用就寫成:

復制代碼 代碼如下:

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

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

4. Flash跨域:

它會訪問目標網站根目錄下面的crossdomain.xml文件,根據文件中的內容來確定是否允許此次跨域訪問:

復制代碼 代碼如下:

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

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

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

復制代碼 代碼如下:

otherWindow.postMessage(message, targetOrigin);

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

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

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

7. Access Control

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

復制代碼 代碼如下:

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

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

8. window.name

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

9. document.domain

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

10. Fragment Identitier Messaging(FIM)

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

11. Cross Frame(CF)

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

12. Cookie+P3P協議

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

復制代碼 代碼如下:

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品高清在线观看| 不卡在线观看电视剧完整版| 欧美裸体男粗大视频在线观看| 亚洲女人天堂成人av在线| 久久久久免费视频| 国产精品美女在线观看| 色综合导航网站| 亚洲精品资源美女情侣酒店| 日本伊人精品一区二区三区介绍| 欧美噜噜久久久xxx| 中文字幕亚洲欧美一区二区三区| 欧美电影免费观看大全| 日韩一区二区欧美| 欧美性视频网站| 欧美香蕉大胸在线视频观看| 亚洲国产美女久久久久| 亚洲精品日韩在线| 日韩av一区二区在线观看| 97成人超碰免| 成人午夜在线视频一区| 精品视频在线观看日韩| 91丝袜美腿美女视频网站| 92版电视剧仙鹤神针在线观看| 日韩av中文字幕在线免费观看| 一区二区中文字幕| 久久最新资源网| 精品亚洲一区二区三区在线播放| 久久久久999| 日韩电影免费观看在线观看| 欧美精品激情在线| 在线观看欧美日韩国产| 国产精品wwww| 久久久久久成人| 亚洲成avwww人| 精品亚洲一区二区| 日韩中文字幕久久| 亚洲人av在线影院| 欧美极品在线视频| 久久久久久久久久久久av| 91免费看视频.| 欧美日韩国产综合视频在线观看中文| 欧洲成人性视频| 亚洲欧美色婷婷| 国产精品电影久久久久电影网| 欧美大奶子在线| 亚洲香蕉成人av网站在线观看| 欧美黑人一级爽快片淫片高清| 亚洲国产成人精品女人久久久| 亚洲一区二区在线| 久久久精品影院| 日本亚洲精品在线观看| 日韩女优人人人人射在线视频| 亚洲一区二区久久久久久| 第一福利永久视频精品| 精品久久香蕉国产线看观看亚洲| 国内揄拍国内精品少妇国语| 国产狼人综合免费视频| 久久久久久久久国产| 高清欧美一区二区三区| 91免费视频网站| 九九九热精品免费视频观看网站| 成人在线视频福利| 2019国产精品自在线拍国产不卡| 久久人人爽国产| 国产成人精品日本亚洲| 在线中文字幕日韩| 亚洲va欧美va在线观看| 成人性生交大片免费观看嘿嘿视频| 最近2019中文字幕大全第二页| 欧美www视频在线观看| 2020国产精品视频| 亚洲色图色老头| 亚洲精品国产精品国自产观看浪潮| 免费91在线视频| 欧美日韩亚洲精品一区二区三区| 97免费视频在线| 久久精品小视频| 日韩视频免费在线观看| 一本色道久久88精品综合| 色综合天天狠天天透天天伊人| 久久精品99久久香蕉国产色戒| 国产丝袜高跟一区| 人妖精品videosex性欧美| 91精品视频在线看| 日韩av大片在线| 久久精品国产亚洲精品| 97视频在线观看网址| 亚洲aaaaaa| 国产91精品黑色丝袜高跟鞋| 777精品视频| 亚洲va欧美va国产综合剧情| 搡老女人一区二区三区视频tv| 国产日韩精品电影| www.欧美三级电影.com| 国产成人精品一区二区三区| 日韩电影免费观看中文字幕| 亚洲国产精品美女| 久久精品男人天堂| 国产91网红主播在线观看| 国产精品美女主播| 日韩在线播放av| 亚洲日本aⅴ片在线观看香蕉| 欧美裸体xxxx极品少妇| 97精品久久久中文字幕免费| 亚洲国产精品久久久久秋霞蜜臀| 亚洲精品99久久久久中文字幕| 中文字幕一区二区精品| 国产精品高潮呻吟视频| 国产精品高清网站| 成人性生交大片免费看视频直播| 欧美高清电影在线看| 欧美乱人伦中文字幕在线| 精品中文字幕在线观看| 精品国产一区二区三区四区在线观看| 欧美乱大交xxxxx| 日韩国产高清视频在线| 日本一区二区在线播放| 91在线视频一区| 成人国产在线视频| 久久理论片午夜琪琪电影网| 国产成人综合亚洲| 亚洲福利影片在线| 国产精品久久久久久久久免费看| 日韩欧美中文免费| 欧美激情精品久久久久久免费印度| 日韩av影院在线观看| 92国产精品久久久久首页| 国产视频自拍一区| 尤物99国产成人精品视频| 国产精品18久久久久久首页狼| 色先锋资源久久综合5566| 欧美激情一区二区久久久| 久久久久久久久久久91| 欧美猛交ⅹxxx乱大交视频| 欧美猛少妇色xxxxx| 日韩亚洲一区二区| 日韩免费不卡av| 精品magnet| 69av成年福利视频| 亚洲аv电影天堂网| 成人h视频在线| 91在线免费网站| 欧美伊久线香蕉线新在线| 一本一本久久a久久精品牛牛影视| 国产综合久久久久| 亚洲国产精品久久久久秋霞蜜臀| 欧美在线视频导航| 色综合久久88| 亚洲视频在线免费看| 国产精品偷伦视频免费观看国产| 97精品视频在线| 国产主播精品在线| 欧美激情精品久久久久久久变态| 最近2019中文字幕在线高清| 国产成人综合一区二区三区| 欧美色欧美亚洲高清在线视频| 亚洲另类欧美自拍| 久热精品视频在线| 国产日韩欧美在线看| 欧美一级电影免费在线观看| 在线观看日韩视频| 国产精品国产三级国产aⅴ浪潮| 亚洲国产精品小视频| 亚洲精品久久久久久久久久久久久|