傳說中的ajax(二)——跨域
1、利用多個域名來儲存網站資源
利用多個域名來儲存網站資源會更有效。
Cookieless, 節省頻寬;
資料作了劃分,減輕單臺伺服器的壓力;
突破瀏覽器限制,就算某個域名崩潰,也能通過其他域名訪問網站;
防止不必要的安全問題;
2、同源策略
同源策略是一種安全協議,指一段指令碼只能讀取來自同一來源的視窗和文件的屬性。所謂同源指的是:協議、埠、域名相同。同源策略是客戶端指令碼的重要的安全度量標準,目的是防止某個文件或指令碼從多個不同源裝載。
3、跨域
跨域的概念:協議埠域名都相同才同域,否則都是跨域。
JSONP跨域的設定方式:
1 利用script標籤可以進行跨域請求的特點進行請求傳送
2 script標籤請求的內容會被當做js程式碼執行
3 在服務端設定響應內容為一個函式呼叫的字串,例如: echo ‘fun()’;
4 將請求的資料放置在函式呼叫的內部作為引數
5 在客戶端部分,需要在請求傳送之前設定對應的函式體,接收響應的資料
6 如果資料為JSON形式,不需要進行轉換,可以直接使用
jsonp不是ajax技術。
4、jsonp功能封裝
1 將資料處理為urlencoded形式
2 動態建立script標籤
3 設定處理函式
function jsonp (url, data, success) { // url : 請求路徑 , data : 請求引數 // 1 將資料處理為urlencoded形式 if (data) { var str = ''; for (var k in data) { str += '&' + k + '=' + data[k]; } data = str; } else { data = ''; } // 2 動態建立script標籤 var script = document.createElement('script'); var randomName = 'fun' + +new Date() + Math.random().toString().slice(2); script.src = url + '?callback=' + randomName + data; document.body.appendChild(script); // 3 設定處理函式fun window[randomName] = function (datas) { success(datas); // 可以在處理函式使用完畢後,將當前函式刪除,同時將頁面中的script標籤也進行刪除 delete window[randomName]; document.body.removeChild(script); }; }
5、jQuery中的jsonp設定方式
jQuery在設定jsonp操作時借用了$.ajax(),但是ajax和JSONP沒有任何關聯
$.ajax({
method : 'GET',
url : 'http://www.ajaxstudy.net/test.php',
success : function (datas) {
console.log(datas);
},
// 給dataType設定為jsonp後表示當前請求以jsonp形式傳送,就不是這個屬性的原始功能含義了。
dataType : 'jsonp'
});
6、資料介面
① 資料介面:能夠提供資料訪問能力的事物稱為資料介面。資料介面的形式為一個地址,通過對這個地址進行請求,可以得到相應的資料。
② 資料介面通常分為兩類:自定義的資料介面和第三方的資料介面。第三方資料介面通常為jsonp形式。需要進行跨域請求操作。
③ 資料介面的使用:根據api文件查詢具體功能。
7、JSONP優缺點
優點: ① 由於服務端直接響應的為函式呼叫包裹資料的形式,如果使用JSON結構在客戶端無需解析。這就比ajax的解析速度要快
② 可以跨域,使用簡便。
缺點: ① 只能進行get請求,請求引數具有大小限制。
② 不是標準方式,但是不影響使用。
8、CORS跨域
CORS(cross origin resource sharing)跨域資源共享,這是一種標準的跨域實現方式。
設定方式:按照正常的ajax進行請求傳送操作,在服務端設定對應的響應頭資訊。
$.ajax({
method : 'POST',
url : 'http://www.ajaxstudy.net/cors.php',
success : function (datas) {
console.log(datas);
}
});
9、服務端代理跨域
客戶端由於同源策略限制,無法直接進行跨域的ajax請求,服務端進行請求是沒有同源策略限制的。使用自己的服務端請求其他服務端,將資料得到後,客戶端請求自己的服務端獲取資料。
$.ajax({
url : '/datas.php',
success : function (datas) {
console.log(datas);
}
});