(1)CORS
下面是MDN對(duì)于CORS的定義:
跨域資源共享(CORS) 是一種機(jī)制,它使用額外的 HTTP 頭來(lái)告訴瀏覽器 讓運(yùn)行在一個(gè) origin (domain)上的Web應(yīng)用被準(zhǔn)許訪問(wèn)來(lái)自不同源服務(wù)器上的指定的資源。當(dāng)一個(gè)資源從與該資源本身所在的服務(wù)器不同的域、協(xié)議或端口請(qǐng)求一個(gè)資源時(shí),資源會(huì)發(fā)起一個(gè)跨域HTTP 請(qǐng)求。
CORS需要瀏覽器和服務(wù)器同時(shí)支持,整個(gè)CORS過(guò)程都是瀏覽器完成的,無(wú)需用戶參與。因此實(shí)現(xiàn)CORS的關(guān)鍵就是服務(wù)器,只要服務(wù)器實(shí)現(xiàn)了CORS請(qǐng)求,就可以跨源通信了。
瀏覽器將CORS分為簡(jiǎn)單請(qǐng)求和非簡(jiǎn)單請(qǐng)求:
簡(jiǎn)單請(qǐng)求不會(huì)觸發(fā)CORS預(yù)檢請(qǐng)求。若該請(qǐng)求滿足以下兩個(gè)條件,就可以看作是簡(jiǎn)單請(qǐng)求:
1)請(qǐng)求方法是以下三種方法之一:HEADGETPOST2)HTTP的頭信息不超出以下幾種字段:AcceptAccept-LanguageContent-LanguageLast-Event-IDContent-Type:只限于三個(gè)值application/x-www-form-urlencoded、multipart/form-data、text/plain若不滿足以上條件,就屬于非簡(jiǎn)單請(qǐng)求了。
(1)簡(jiǎn)單請(qǐng)求過(guò)程:
對(duì)于簡(jiǎn)單請(qǐng)求,瀏覽器會(huì)直接發(fā)出CORS請(qǐng)求,它會(huì)在請(qǐng)求的頭信息中增加一個(gè)Orign字段,該字段用來(lái)說(shuō)明本次請(qǐng)求來(lái)自哪個(gè)源(協(xié)議+端口+域名),服務(wù)器會(huì)根據(jù)這個(gè)值來(lái)決定是否同意這次請(qǐng)求。如果Orign指定的域名在許可范圍之內(nèi),服務(wù)器返回的響應(yīng)就會(huì)多出以下信息頭:
如果Orign指定的域名不在許可范圍之內(nèi),服務(wù)器會(huì)返回一個(gè)正常的HTTP回應(yīng),瀏覽器發(fā)現(xiàn)沒有上面的Access-Control-Allow-Origin頭部信息,就知道出錯(cuò)了。這個(gè)錯(cuò)誤無(wú)法通過(guò)狀態(tài)碼識(shí)別,因?yàn)榉祷氐臓顟B(tài)碼可能是200。
在簡(jiǎn)單請(qǐng)求中,在服務(wù)器內(nèi),至少需要設(shè)置字段:Access-Control-Allow-Origin
(2)非簡(jiǎn)單請(qǐng)求過(guò)程
非簡(jiǎn)單請(qǐng)求是對(duì)服務(wù)器有特殊要求的請(qǐng)求,比如請(qǐng)求方法為DELETE或者PUT等。非簡(jiǎn)單請(qǐng)求的CORS請(qǐng)求會(huì)在正式通信之前進(jìn)行一次HTTP查詢請(qǐng)求,稱為預(yù)檢請(qǐng)求。
瀏覽器會(huì)詢問(wèn)服務(wù)器,當(dāng)前所在的網(wǎng)頁(yè)是否在服務(wù)器允許訪問(wèn)的范圍內(nèi),以及可以使用哪些HTTP請(qǐng)求方式和頭信息字段,只有得到肯定的回復(fù),才會(huì)進(jìn)行正式的HTTP請(qǐng)求,否則就會(huì)報(bào)錯(cuò)。
預(yù)檢請(qǐng)求使用的請(qǐng)求方法是OPTIONS,表示這個(gè)請(qǐng)求是來(lái)詢問(wèn)的。他的頭信息中的關(guān)鍵字段是Orign,表示請(qǐng)求來(lái)自哪個(gè)源。除此之外,頭信息中還包括兩個(gè)字段:Access-Control-Request-Method:該字段是必須的,用來(lái)列出瀏覽器的CORS請(qǐng)求會(huì)用到哪些HTTP方法。
Access-Control-Request-Headers: 該字段是一個(gè)逗號(hào)分隔的字符串,指定瀏覽器CORS請(qǐng)求會(huì)額外發(fā)送的頭信息字段。服務(wù)器在收到瀏覽器的預(yù)檢請(qǐng)求之后,會(huì)根據(jù)頭信息的三個(gè)字段來(lái)進(jìn)行判斷,如果返回的頭信息在中有Access-Control-Allow-Origin這個(gè)字段就是允許跨域請(qǐng)求,如果沒有,就是不同意這個(gè)預(yù)檢請(qǐng)求,就會(huì)報(bào)錯(cuò)。
服務(wù)器回應(yīng)的CORS的字段如下:
只要服務(wù)器通過(guò)了預(yù)檢請(qǐng)求,在以后每次的CORS請(qǐng)求都會(huì)自帶一個(gè)Origin頭信息字段。服務(wù)器的回應(yīng),也都會(huì)有一個(gè)Access-Control-Allow-Origin頭信息字段。
在非簡(jiǎn)單請(qǐng)求中,至少需要設(shè)置以下字段:
減少OPTIONS請(qǐng)求次數(shù):