這次帶給大家web開發跨域的使用方法,web開發跨域使用的注意事項有哪些,下面就是實戰案例,一起來看一下。
在大家進行web開發過程中,對於跨域都會有接觸,很多人不是很了解跨域是什麼,對於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/foo var 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/bar document.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標籤都是可以跨域的,包括,
# 限制:需要建立一個DOM對象,只能用於GET方法
在document.body
中append一個具有src屬性的HTML標籤,src屬性值指向的URL會以GET方法被訪問,該訪問是可以跨域的
其實樣式表的標籤也是可以跨域的,只要是有src或href的HTML標籤都有跨域的能力
不同的HTML標籤發送HTTP請求的時機不同,例如在更改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
原理: