1. 程式人生 > >CORS(跨域資源共享)

CORS(跨域資源共享)

簡介

跨域資源共享的主要思想就是使用自定義的HTTP頭部讓瀏覽器與伺服器進行溝通,從而決定響應式是成功還是失敗,它允許了瀏覽器向跨源伺服器傳送請求,克服了同源的限制。

CORS需要瀏覽器和伺服器同時支援,所有瀏覽器目前都支援,IE需要10以上。在整個通訊過程中,不需要使用者參與,都是由瀏覽器自動完成。對開發者來說,CORS和普通的ajax同源請求一樣,程式碼都一模一樣,所以實現CORS通訊的關鍵是伺服器,只要服務實現了CORS介面或約定,就可以跨源通訊。

CORS的基本流程

瀏覽器將CORS請求分成兩類:簡單請求(simple request)和非簡單請求(not-so-simple request)。
瀏覽器發出CORS簡單請求,只需要在頭資訊之中增加一個Origin欄位。Origin欄位用來說明,本次請求來自哪個源(協議+域名+埠)。伺服器根據這個值,決定是否同意這次請求。
如果Origin制定的源不在許可範圍之內,伺服器會返回一個正常的HTTP迴應。瀏覽器發現Http Response頭資訊中沒有包含Access-Control-Allow-Origin欄位,就判斷出錯並丟擲一個錯誤,被XMLHttpRequest的onerror回撥函式捕獲。注意,這種錯誤無法通過狀態碼識別,因為HTTP迴應的狀態碼有可能是200.

只要同時滿足以下兩大條件,就屬於簡單請求。
1) 請求方法是以下三種方法之一:
HEAD
GET
POST
2)HTTP的頭資訊不超出以下幾種欄位
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type:只限於三個值application/x-www-form-urlencoded、multipart/form-data、text/plain

非簡單請求是對伺服器有特殊要求的請求,比如請求方法是PUT/DELETE,或者Content-Type欄位的型別是application/json。

瀏覽器發出CORS非簡單請求,會在正式通訊之前,增加一次HTTP查詢請求,稱為"預檢"請求(preflight)。瀏覽器先詢問伺服器,當前網頁所在的域名是否在伺服器的許可名單之中,以及可以使用哪些HTTP動詞和頭資訊欄位。只有得到肯定答覆,瀏覽器才會發出正式的XMLHttpRequest請求,否則就報錯。

和Jsonp的區別

CORS與Jsonp使用目的相同,但是Jsonp只支援GET請求,CORS支援所有型別的HTTP請求。JSONP的有時在於支援老式瀏覽器,以及向不支援CORS的網站請求資料

 

引用連結:https://www.jianshu.com/p/52bf8f5b8432