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

首頁 > 網站 > 建站經驗 > 正文

web開發教程之跨域的解決方案詳解

2024-04-25 20:47:22
字體:
來源:轉載
供稿:網友

前言

本文主要給大家介紹了關于web開發之跨域的解決方案,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。

什么是跨域?

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

下面是具體的跨域情況詳解

 

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 主域相同,子域不同 不允許(cookie這種情況下也不允許訪問)
http://www.a.com/a.js、http://a.com/b.js 同一域名,不同二級域名(同上) 不允許(cookie這種情況下也不允許訪問)
http://www.cnblogs.com/a.js、http://www.a.com/b.js 不同域名 不允許

 

一、document.domain跨域

原理:相同主域名不同子域名下的頁面,可以設置document.domain讓它們同域

限制:同域document提供的是頁面間的互操作,需要載入iframe頁面

下面幾個域名下的頁面都是可以通過document.domain跨域互操作的: http://a.com/foo, http://b.a.com/bar, http://c.a.com/bar。 但只能以頁面嵌套的方式來進行頁面互操作,比如常見的iframe方式就可以完成頁面嵌套

// URL http://a.com/foovar ifr = document.createElement('iframe');ifr.src = 'http://b.a.com/bar'; ifr.onload = function(){    var ifrdoc = ifr.contentDocument || ifr.contentWindow.document;    ifrdoc.getElementsById("foo").innerHTML);};ifr.style.display = 'none';document.body.appendChild(ifr);

上述代碼所在的URL是http://a.com/foo,它對http://b.a.com/bar的DOM訪問要求后者將 document.domain往上設置一級

// URL http://b.a.com/bardocument.domain = 'a.com'

document.domain只能從子域設置到主域,往下設置以及往其他域名設置都是不允許的, 在Chrome中給出的錯誤是這樣的

Uncaught DOMException: Failed to set the 'domain' property on 'Document': 'baidu.com' is not a suffix of 'b.a.com'

二、有src的標簽

原理:所有具有src屬性的HTML標簽都是可以跨域的,包括<img>, <script>

限制:需要創建一個DOM對象,只能用于GET方法

document.body中append一個具有src屬性的HTML標簽, src屬性值指向的URL會以GET方法被訪問,該訪問是可以跨域的

其實樣式表的<link>標簽也是可以跨域的,只要是有src或href的HTML標簽都有跨域的能力

不同的HTML標簽發送HTTP請求的時機不同,例如<img>在更改src屬性時就會發送請求,而script, iframe, link[rel=stylesheet]只有在添加到DOM樹之后才會發送HTTP請求:

var img = new Image();img.src = 'http://some/picture';        // 發送HTTP請求var ifr = $('<iframe>', {src: 'http://b.a.com/bar'});$('body').append(ifr);                  // 發送HTTP請求

三、JSONP

原理:<script>是可以跨域的,而且在跨域腳本中可以直接回調當前腳本的函數

限制:需要創建一個DOM對象并且添加到DOM樹,只能用于GET方法

JSONP利用的是<script>可以跨域的特性,跨域URL返回的腳本不僅包含數據,還包含一個回調

// URL: http://b.a.com/foovar data = {    foo: 'bar',    bar: 'foo'};callback(data);

然后在我們在主站http://a.com中,可以這樣來跨域獲取http://b.a.com的數據:

// URL: http://a.com/foovar callback = function(data){    // 處理跨域請求得到的數據};var script = $('<script>', {src: 'http://b.a.com/bar'});$('body').append(script);

其實jQuery已經封裝了JSONP的使用,我們可以這樣來

$.getJSON( "http://b.a.com/bar?callback=callback", function( data ){    // 處理跨域請求得到的數據});

$.getJSON與$.get的區別是前者會把responseText轉換為JSON,而且當URL具有callback參數時, jQuery將會把它解釋為一個JSONP請求,創建一個<script>標簽來完成該請求

四、navigation 對象

原理:iframe之間是共享navigator對象的,用它來傳遞信息

要求:IE6/7

有些人注意到了IE6/7的一個漏洞:iframe之間的window.navigator對象是共享的。 我們可以把它作為一個Messenger,通過它來傳遞信息。比如一個簡單的委托:

// a.comnavigation.onData(){    // 數據到達的處理函數}typeof navigation.getData === 'function'     || navigation.getData()
// b.comnavigation.getData = function(){    $.get('/path/under/b.com')        .success(function(data){            typeof navigation.onData === 'function'                || navigation.onData(data)        });}

document.navigator類似,window.name也是當前窗口所有頁面所共享的。也可以用它來傳遞信息。 同樣蛋疼的辦法還有傳遞Hash(有些人叫錨點),這是因為每次瀏覽器打開一個URL時,URL后面的#xxx部分會保留下來,那么新的頁面可以從這里獲得上一個頁面的數據

五、跨域資源共享(CORS)

原理:服務器設置Access-Control-Allow-OriginHTTP響應頭之后,瀏覽器將會允許跨域請求

限制:瀏覽器需要支持HTML5,可以支持POST,PUT等方法

前面提到的跨域手段都是某種意義上的Hack, HTML5標準中提出的跨域資源共享(Cross Origin Resource Share,CORS)才是正道。 它支持其他的HTTP方法如PUT, POST等,可以從本質上解決跨域問題。

例如,從http://a.com要訪問http://b.com的數據,通常情況下Chrome會因跨域請求而報錯

XMLHttpRequest cannot load http://b.com. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://a.com' is therefore not allowed access

錯誤原因是被請求資源沒有設置Access-Control-Allow-Origin,所以我們在b.com的服務器中設置這個響應頭字段即可

Access-Control-Allow-Origin: *              # 允許所有域名訪問,或者Access-Control-Allow-Origin: http://a.com   # 只允許所有域名訪問

六、window.postMessage

原理:HTML5允許窗口之間發送消息

限制:瀏覽器需要支持HTML5,獲取窗口句柄后才能相互通信

這是一個安全的跨域通信方法,postMessage(message,targetOrigin)也是HTML5引入的特性。 可以給任何一個window發送消息,不論是否同源。第二個參數可以是*但如果你設置了一個URL但不相符,那么該事件不會被分發??匆粋€普通的使用方式吧

// URL: http://a.com/foovar win = window.open('http://b.com/bar');win.postMessage('Hello, bar!', 'http://b.com');
// URL: http://b.com/barwindow.addEventListener('message',function(event) {    console.log(event.data);});

七、訪問控制安全的討論

在HTML5之前,JSONP已經成為跨域的事實標準了,jQuery都給出了支持。 值得注意的是它只是Hack,并沒有產生額外的安全問題。 因為JSONP要成功獲取數據,需要跨域資源所在服務器的配合,比如資源所在服務器需要自愿地回調一個合適的函數,所以服務器仍然有能力控制資源的跨域訪問

跨域的正道還是要使用HTML5提供的CORS頭字段以及window.postMessage, 可以支持POST, PUT等HTTP方法,從機制上解決跨域問題。 值得注意的是Access-Control-Allow-Origin頭字段是資源所在服務器設置的, 訪問控制的責任仍然是在提供資源的服務器一方,這和JSONP是一樣的

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到建站經驗頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产午夜精品全部视频在线播放| 97久久久久久| 久久不射热爱视频精品| 日韩激情av在线免费观看| 97在线视频免费| 亚洲欧美日韩久久久久久| 欧美成人午夜激情| 日韩在线www| 国产精品情侣自拍| 精品性高朝久久久久久久| 国产激情久久久| 久99九色视频在线观看| 国产欧美一区二区三区久久人妖| 亚洲人成电影在线观看天堂色| 久久精品99国产精品酒店日本| 国产免费成人av| 久久精品这里热有精品| 中文字幕v亚洲ⅴv天堂| 亚洲国产古装精品网站| 国产综合视频在线观看| 欧美性在线视频| 国产一区二区三区免费视频| 成人免费视频xnxx.com| 国产色婷婷国产综合在线理论片a| 深夜福利亚洲导航| 亚洲视频在线免费看| 亚洲精品98久久久久久中文字幕| 成人国产精品久久久久久亚洲| 国产日韩视频在线观看| 成人做爰www免费看视频网站| 成人黄色中文字幕| 亚洲午夜国产成人av电影男同| 日本精品视频在线| 欧美俄罗斯性视频| 久久久久久九九九| 国产91免费观看| 欧美巨乳美女视频| 亚洲一品av免费观看| 亚洲天堂av图片| 精品国内亚洲在观看18黄| 久久人人爽人人| 91亚洲精品在线观看| 日韩电影中文 亚洲精品乱码| 亚洲xxx大片| 亚洲欧美日韩天堂一区二区| 韩国一区二区电影| 欧美精品亚州精品| 国产丝袜一区二区三区| 亚洲国产精品va在看黑人| 亚洲专区在线视频| 国产日本欧美一区二区三区| www.国产一区| 97成人精品视频在线观看| 国内精品视频一区| 亚洲欧美日韩直播| 国产精品久久久久7777婷婷| 国产精品久久久久aaaa九色| 亚洲成年人在线播放| 超碰精品一区二区三区乱码| 性欧美在线看片a免费观看| 日韩电影在线观看永久视频免费网站| 欧美成人性色生活仑片| 色妞色视频一区二区三区四区| 国产99久久精品一区二区| 青青a在线精品免费观看| 久久久国产视频| 亚洲第一区在线| 久久久www成人免费精品| 国产成人综合精品| 日韩精品在线观看网站| 国产精品尤物福利片在线观看| 久久深夜福利免费观看| 日韩精品高清在线观看| 欧美华人在线视频| 欧美午夜视频在线观看| 中文字幕精品一区二区精品| 777777777亚洲妇女| 精品久久久精品| 久久久久国产视频| 国产91精品久久久久久| 日本免费在线精品| 欧美成人精品h版在线观看| 日本三级久久久| 久久男人av资源网站| 韩国精品美女www爽爽爽视频| 国产在线98福利播放视频| 尤物99国产成人精品视频| 欧美性猛交xxxx乱大交极品| 久久久久久久香蕉网| 欧美电影《睫毛膏》| 亚洲精品视频免费| 久久久精品久久| 亚洲国产欧美一区二区三区久久| 中文字幕亚洲天堂| 国产精品 欧美在线| 国产精品自拍视频| 日韩精品黄色网| 亚洲影院色无极综合| 成人在线精品视频| 日韩少妇与小伙激情| 91美女片黄在线观| 亚洲欧美国产精品va在线观看| 欧美一级片一区| 欧美肥婆姓交大片| 日韩欧美在线免费观看| 欧美日韩在线视频一区二区| 91精品国产综合久久香蕉最新版| 2019最新中文字幕| 夜夜躁日日躁狠狠久久88av| 久久久www成人免费精品张筱雨| 国产精品91久久久久久| 久久久久久av| 久久av资源网站| 日韩极品精品视频免费观看| 96精品久久久久中文字幕| 国产成人鲁鲁免费视频a| 亚洲欧美一区二区三区四区| 亚洲精品视频网上网址在线观看| 国产亚洲精品久久久| 国产a∨精品一区二区三区不卡| 欧美午夜www高清视频| 亚洲国产欧美日韩精品| 国产成人一区二区在线| 精品国产一区二区在线| 久久久精品亚洲| 日本韩国在线不卡| 亚洲精品电影在线观看| 91精品国产乱码久久久久久蜜臀| 国产极品精品在线观看| 欧美激情精品久久久久久变态| 上原亚衣av一区二区三区| 亚洲嫩模很污视频| 亚洲性猛交xxxxwww| 日韩成人高清在线| 久久国内精品一国内精品| 成人综合国产精品| 亚洲黄在线观看| 国产精品成人在线| 亚洲国产黄色片| 精品视频偷偷看在线观看| 国产精品激情av在线播放| 主播福利视频一区| 日韩最新中文字幕电影免费看| 亚洲色图50p| 亚洲国产精品小视频| 成人免费大片黄在线播放| 久久亚洲综合国产精品99麻豆精品福利| 岛国av一区二区| 久操成人在线视频| 久久人人爽人人爽人人片亚洲| 韩国美女主播一区| 美乳少妇欧美精品| 黄色一区二区三区| 98午夜经典影视| 欧美极品少妇xxxxⅹ喷水| 色香阁99久久精品久久久| 成人网在线免费观看| 亚洲天堂av在线播放| 亚洲欧美在线播放| 2021久久精品国产99国产精品| 久久天天躁狠狠躁夜夜av| 国产一区二区三区在线| 国产精品亚洲第一区| 91久久在线播放|