欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

ajax跨域的解決方案-創(chuàng)新互聯(lián)

今天小編給大家分享的是ajax跨域的解決方案,相信很多人都不太了解,為了讓大家更加了解ajax跨域的解決方案,所以給大家總結(jié)了以下內(nèi)容,一起往下看吧。一定會有所收獲的哦

成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比鷹手營子網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式鷹手營子網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋鷹手營子地區(qū)。費用合理售后完善,十年實體公司更值得信賴。

1. AJAX

AJAX(Asynchronous JavaScript and XML),意思就是用JavaScript執(zhí)行異步網(wǎng)絡(luò)請求。
主要可以通過架設(shè)代理服務(wù)器,JSONP和CORS三種方案實現(xiàn)跨域
用JavaScript寫一個完整的AJAX代碼并不復(fù)雜,但是需要注意:AJAX請求是異步執(zhí)行的,也就是說,要通過回調(diào)函數(shù)獲得響應(yīng)。

ajax跨域的解決方案

創(chuàng)建ajax的過程一般如下:

創(chuàng)建XMLHttpRequest對象,也就是創(chuàng)建一個異步調(diào)用對象;判斷XHR對象屬性;創(chuàng)建一個新的HTTP請求,并指定該HTTP請求的方法、URL及驗證信息;設(shè)置響應(yīng)HTTP請求狀態(tài)變化的函數(shù);發(fā)送HTTP請求;獲取異步調(diào)用返回的數(shù)據(jù);使用JavaScript和DOM實現(xiàn)局部刷新。

代碼。

var xmlhttp;function createXMLHttpRequest () {
    xmlhttp = null;    if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
    }    // 異步調(diào)用服務(wù)器段數(shù)據(jù)
    if (xmlhttp != null) {        // 創(chuàng)建http請求
        xmlhttp.open('GET/POST', url, true);        // 設(shè)置http請求狀態(tài)變化的函數(shù)
        xmlhttp.onreadystatechange = httpStateChange;        // 發(fā)送請求
        xmlhttp.send(null);
    } else {        console.log('不支持XHR');
    }
} 
// 響應(yīng)HTTP請求狀態(tài)變化的函數(shù)function httpStateChange () { //判斷異步調(diào)用是否完成
    if (xmlhttp.readyState == 4) {//readyState==4表示后臺處理完成了
        if (xmlhttp.status >= 200 && xmlhttp.status < 300 || xmlhttp.status == 304){        //判斷異步調(diào)用是否成功,如果成功開始局部更新數(shù)據(jù)
            //code...
        } else{            console.log("出錯狀態(tài)碼:" + xmlhttp.status + "出錯信息:" + xmlhttp.statusText);
        }
    }
}

對于低版本的IE,需要換一個ActiveXObject對象,如果你想把標(biāo)準(zhǔn)寫法和IE寫法混在一起,可以這么寫。

var request;if (window.XMLHttpRequest) {
   request = new XMLHttpRequest();
} else {
  request = new ActiveXObject('Microsoft.XMLHTTP');
}

通過檢測window對象是否有XMLHttpRequest屬性來確定瀏覽器是否支持標(biāo)準(zhǔn)的XMLHttpRequest。注意,不要根據(jù)瀏覽器的navigator.userAgent來檢測瀏覽器是否支持某個JavaScript特性,一是因為這個字符串本身可以偽造,二是通過IE版本判斷JavaScript特性將非常復(fù)雜。

當(dāng)創(chuàng)建了XMLHttpRequest對象后,要先設(shè)置onreadystatechange
的回調(diào)函數(shù)。在回調(diào)函數(shù)中,通常我們只需通過readyState === 4判斷請求是否完成,如果已完成,再根據(jù)status判斷是否是一個成功的響應(yīng)。

XMLHttpRequest對象的open()方法有3個參數(shù),第一個參數(shù)指定是GET還是POST,第二個參數(shù)指定URL地址,第三個參數(shù)指定是否使用異步,默認是true,所以不用寫。注意,千萬不要把第三個參數(shù)指定為false,否則瀏覽器將停止響應(yīng),直到AJAX請求完成。如果這個請求耗時10秒,那么10秒內(nèi)你會發(fā)現(xiàn)瀏覽器處于“假死”狀態(tài)。

最后調(diào)用send()方法才真正發(fā)送請求。GET請求不需要參數(shù),POST請求需要把body部分以字符串或者FormData對象傳進去。

2. 跨域安全限制

因為瀏覽器的“同源策略”,協(xié)議、域名、端口號若有一個不同,則不能訪問。AJAX本身是不能跨域的,AJAX直接請求普通文件存在跨域無權(quán)限訪問的問題,只要是跨域請求,一律不準(zhǔn);但是配合后臺可以跨域。

因為同源策略限制的是瀏覽器但是對服務(wù)器不限制,服務(wù)器可以跨域。
那是不是用JavaScript無法請求外域(就是其他網(wǎng)站)的URL了呢?方法還是有的,大概有以下幾種。

2.1 CORS

CORS(Cross-Origin Resource Sharing,跨源資源共享)是W3C的一個草案,定義了在必須訪問跨域資源時,瀏覽器與服務(wù)器應(yīng)該如何溝通。

CORS背后的基本思想就是使用自定義的HTTP頭部讓瀏覽器與服務(wù)器進行溝通,從而決定請求或響應(yīng)是應(yīng)該成功,還是應(yīng)該失敗。

比如一個簡單的使用GET或者POST發(fā)送的請求,它沒有自定義頭部,而主體內(nèi)容是text/plain。在發(fā)送該請求時,需要給它附加一個額外的Origin頭部,其中包含請求頁面的源信息(協(xié)議、域名和端口),以便服務(wù)器根據(jù)這個頭部信息來決定是否給予響應(yīng)。下面是Origin頭部的一個示例。

Origin: http://www.nczonline.net

如果服務(wù)器認為這個請求可以接受,就在Access-Control-Allow-Origin頭部中回發(fā)相同的源信息(如果是公共資源,可以回發(fā)'*')。例如:

Access-Control-Allow-Origin: http://www.nczonline.net

如果沒有這個頭部,或者有這個頭部但源信息不匹配,瀏覽器就會駁回請求。正常情況下,瀏覽器會處理請求。注意,請求進而響應(yīng)都不包含cookie信息。

目前,所有瀏覽器都支持該功能,IE瀏覽器不能低于IE10。整個CORS通信過程,都是瀏覽器自動完成,不需要用戶參與。對于開發(fā)者來說,CORS通信與同源的AJAX通信沒有差別,代碼完全一樣。瀏覽器一旦發(fā)現(xiàn)AJAX請求跨源,就會自動添加一些附加的頭信息,有時還會多出一次附加的請求,但用戶不會有感覺。

因此,實現(xiàn)CORS通信的關(guān)鍵是服務(wù)器。只要服務(wù)器實現(xiàn)了CORS接口,就可以跨源通信。

平時的ajax請求可能是這樣的:

<script type="text/javascript">
    var xhr = new XMLHttpRequest();
    xhr.open("POST", "/damonare",true);
    xhr.send();</script>

以上damonare部分是相對路徑,如果我們要使用CORS,相關(guān)Ajax代碼可能如下所示:

<script type="text/javascript">
    var xhr = new XMLHttpRequest();
    xhr.open("GET", "http://segmentfault.com/u/trigkit4/",true);
    xhr.send();</script>

代碼與之前的區(qū)別就在于相對路徑換成了其他域的絕對路徑,也就是你要跨域訪問的接口地址。

服務(wù)器端對于CORS的支持,主要就是通過設(shè)置Access-Control-Allow-Origin來進行的。如果瀏覽器檢測到相應(yīng)的設(shè)置,就可以允許Ajax進行跨域的訪問。

2.2 圖像Ping

我們知道,一個網(wǎng)頁可以從任何網(wǎng)頁中加載圖像,不用擔(dān)心跨域不跨域。這也是在線廣告跟蹤瀏覽量的主要方式。我們也可以動態(tài)的創(chuàng)建圖像,使用它們的onload和onerror事件處理成西來確定是否接收到了響應(yīng)。

動態(tài)創(chuàng)建圖像經(jīng)常用于圖像Ping。
圖像Ping是與服務(wù)器進行簡單、單向的跨域通信的一種方式。請求的數(shù)據(jù)是通過查詢字符串形式發(fā)送的,而響應(yīng)可以是任意內(nèi)容,但通常是像素圖或204響應(yīng)。通過圖像Ping,瀏覽器得不到任何具體的數(shù)據(jù),但通過偵聽load和error事件,它能知道響應(yīng)是什么時候收到的。

來看下面的例子。

var img = new Image();
img.onload = img.onerror = function () {    console.log('Done');
};
img.src = 'http://www.example.com/test?name=Nico';

這里創(chuàng)建了一個Image的實例,然后將onload和onerror事件處理程序指定為同一個函數(shù)。這樣無論是什么響應(yīng),只要請求完成,就能得到通知。請求從設(shè)置src屬性那一刻開始,而這個例子在請求中發(fā)送了一個name參數(shù)。

圖像Ping最常用于跟蹤用戶點擊頁面或動態(tài)廣告曝光次數(shù)。
圖像Ping有兩個主要的缺點:

只能發(fā)送GET請求。無法訪問服務(wù)器的響應(yīng)文本。

因此,圖像Ping只能用于瀏覽器與服務(wù)器間的單向通信。

2.3 JSONP

JSONP是JSON with padding(填充式JSON或參數(shù)式JSON)的簡寫,是應(yīng)用JSON的一種新方法。JSONP與JSON看起來差不多,只不過是被包含在函數(shù)調(diào)用中的JSON,如下。

callback({'name': 'Azure'});

JSONP由兩部分組成:回調(diào)函數(shù)和數(shù)據(jù)。回調(diào)函數(shù)是當(dāng)響應(yīng)到來時應(yīng)該在頁面中調(diào)用的函數(shù)。回調(diào)函數(shù)的名字一般是在請求中指定的,而數(shù)據(jù)就是傳入回調(diào)參數(shù)中JSON數(shù)據(jù)。下面是一個典型的JSONP請求。

http://freegeoip.net/json/?callback=handleResponse

這個URL是在請求一個JSONP地理定位服務(wù)。通過查詢字符串來指定JSONP服務(wù)的回調(diào)參數(shù)是很常見的,就像上面的URL所示,這里指定的回調(diào)函數(shù)的名字叫handleResponse()。

JSONP是通過動態(tài)<script>元素來使用的,使用時可以為src屬性指定一個跨域URL。
這里的<scriot>元素與<img>元素類似,都有能力不受限制的從其他域加載資源。因為JSONP是有效的JS代碼,所以在請求完成后,即在JSONP響應(yīng)加載到頁面中以后,就會立即執(zhí)行。來看一個例子。

function handleResponse (response) {    
console.log('u r at IP address ' + response.ip + ', which is in ' + response.city + ', ' + response.region_name);
} 
var script = document.createElement('script');
script.src = 'http://freegeoip.net/json/?callback=handleResponse';
document.body.insertBefore(script, document.body.firstChild);

這個例子通過查詢地理定位服務(wù)來顯示IP地址和地理位置信息。

JSONP之所以在開發(fā)人員中極為流行,主要原因是它非常簡單易用。與圖像Ping相比,它的優(yōu)點在于能夠直接訪問響應(yīng)文本,支持在瀏覽器與服務(wù)器之間雙向通信。不過,JSONP也有兩點不足。

首先,安全性問題。JSONP是從其他域中加載代碼執(zhí)行。如果其他域不安全,很可能會在響應(yīng)中夾帶一些惡意代碼,而此時除了完全放棄JSONP調(diào)用之外,沒有辦法追究。因此在使用不是自己運維的Web服務(wù)時,一定得保證它安全可靠。
其次,要確定JSONP請求是否失敗并不容易。

CORS和JSONP對比

JSONP只能實現(xiàn)GET請求,而CORS支持所有類型的HTTP請求。使用CORS,開發(fā)者可以使用普通的XMLHttpRequest發(fā)起請求和獲得數(shù)據(jù),比起JSONP有更好的錯誤處理。SONP主要被老的瀏覽器支持,它們往往不支持CORS,而絕大多數(shù)現(xiàn)代瀏覽器都已經(jīng)支持了CORS。

以上就是ajax跨域的解決方案的詳細內(nèi)容了,看完之后是否有所收獲呢?如果想了解更多相關(guān)內(nèi)容,歡迎來創(chuàng)新互聯(lián)行業(yè)資訊。


另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

分享題目:ajax跨域的解決方案-創(chuàng)新互聯(lián)
分享網(wǎng)址:http://chinadenli.net/article46/pepeg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司App開發(fā)移動網(wǎng)站建設(shè)網(wǎng)站排名Google動態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化