亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

web中如何解決跨域的問題

發布時間:2021-07-13 11:41:52 來源:億速云 閱讀:584 作者:小新 欄目:移動開發

這篇文章主要為大家展示了“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標簽都是可以跨域的,包括<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/foo
var data = {
    foo: 'bar',
    bar: 'foo'
};
callback(data);

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

// URL: http://a.com/foo
var 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.com
navigation.onData(){
    // 數據到達的處理函數
}
typeof navigation.getData === 'function' 
    || navigation.getData()
// b.com
navigation.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/foo
var win = window.open('http://b.com/bar');
win.postMessage('Hello, bar!', 'http://b.com');
// URL: http://b.com/bar
window.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是一樣的

以上是“web中如何解決跨域的問題”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

web
AI

望城县| 双柏县| 汨罗市| 河津市| 基隆市| 望城县| 喀什市| 沂源县| 隆德县| 马鞍山市| 鹿泉市| 梅河口市| 澄迈县| 漠河县| 太仓市| 嵊州市| 栖霞市| 滨州市| 双牌县| 滕州市| 四子王旗| 大丰市| 福州市| 三江| 重庆市| 丽江市| 杭州市| 前郭尔| 潼关县| 金山区| 岢岚县| 虹口区| 广汉市| 苗栗县| 丽水市| 伊川县| 博湖县| 崇仁县| 南溪县| 青龙| 精河县|