CORS跨域請求分為簡單請求和複雜請求。
1. 簡單請求:
滿足一下兩個條件的請求。
(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
2. 複雜請求:
非簡單請求就是複雜請求。
非簡單請求是那種對伺服器有特殊要求的請求,比如請求方法是PUT
或DELETE
,或者Content-Type
欄位的型別是application/json
。
非簡單請求的CORS請求,會在正式通訊之前,增加一次HTTP查詢請求,稱為"預檢"請求(preflight)。
預檢請求為OPTIONS請求,用於向伺服器請求許可權資訊的。
預檢請求被成功響應後,才會發出真實請求,攜帶真實資料。
3. CORS與cookies:
上面說到,CORS請求預設不傳送Cookie和HTTP認證資訊。如果要把Cookie發到伺服器,一方面要伺服器同意,指定Access-Control-Allow-Credentials
欄位。
Access-Control-Allow-Credentials: true
另一方面,開發者必須在AJAX請求中開啟withCredentials
屬性。
var xhr = new XMLHttpRequest(); xhr.withCredentials = true;
//XMLHttpRequest level2才有withCredentials屬性
4. 減少預檢請求次數
服務端設定Access-Control-Max-Age可以將預檢請求進行客戶端快取,減少請求次數
具體可以參考:http://www.ruanyifeng.com/blog/2016/04/cors.html