1. 程式人生 > >傳說中的ajax(二)——跨域

傳說中的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);
			}
		});