OPTIONS請(qǐng)求即預(yù)檢請(qǐng)求恨憎,可用于檢測(cè)服務(wù)器允許的http方法撼港。當(dāng)發(fā)起跨域請(qǐng)求時(shí)督弓,由于安全原因塘幅,觸發(fā)一定條件時(shí)瀏覽器會(huì)在正式請(qǐng)求之前自動(dòng)先發(fā)起OPTIONS請(qǐng)求昔案,即CORS預(yù)檢請(qǐng)求,服務(wù)器若接受該跨域請(qǐng)求电媳,瀏覽器才繼續(xù)發(fā)起正式請(qǐng)求踏揣。
關(guān)于OPTIONS請(qǐng)求
從很多資料我們可以了解到使用OPTIONS方法對(duì)服務(wù)器發(fā)起請(qǐng)求,可以檢測(cè)服務(wù)器支持哪些 HTTP 方法匾乓。但是這次我們并沒有主動(dòng)去發(fā)起OPTIONS請(qǐng)求捞稿,那OPTIONS請(qǐng)
1 OPTIONS請(qǐng)求自動(dòng)發(fā)起
MDN的CORS一文中提到:
規(guī)范要求,對(duì)那些可能對(duì)服務(wù)器數(shù)據(jù)產(chǎn)生副作用的 HTTP 請(qǐng)求方法(特別是 GET 以外的 HTTP 請(qǐng)求拼缝,或者搭配某些 MIME 類型的 POST 請(qǐng)求)娱局,瀏覽器必須首先使用 OPTIONS 方法發(fā)起一個(gè)預(yù)檢請(qǐng)求(preflight request),從而獲知服務(wù)端是否允許該跨域請(qǐng)求咧七。
所以這個(gè)跨域請(qǐng)求觸發(fā)了瀏覽器自動(dòng)發(fā)起OPTIONS請(qǐng)求铃辖,看看此次跨域請(qǐng)求具體觸發(fā)了哪些條件。
2 跨域請(qǐng)求時(shí)猪叙,OPTIONS請(qǐng)求觸發(fā)條件
CORS預(yù)檢請(qǐng)求觸發(fā)條件 |
---|
1. 使用了下面任一HTTP 方法: |
PUT/DELETE/CONNECT/OPTIONS/TRACE/PATCH |
2. 人為設(shè)置了以下集合之外首部字段: |
Accept/Accept-Language/Content-Language/Content-Type/DPR/Downlink/Save-Data/Viewport-Width/Width |
3. Content-Type 的值不屬于下列之一: |
application/x-www-form-urlencoded娇斩、multipart/form-data、text/plain |
3 優(yōu)化OPTIONS請(qǐng)求:Access-Control-Max-Age 或者 避免觸發(fā)
可見一旦達(dá)到觸發(fā)條件穴翩,跨域請(qǐng)求便會(huì)一直發(fā)送2次請(qǐng)求犬第,這樣增加的請(qǐng)求數(shù)是否可優(yōu)化呢?答案是可以芒帕,OPTIONS預(yù)檢請(qǐng)求的結(jié)果可以被緩存歉嗓。
Access-Control-Max-Age這個(gè)響應(yīng)首部表示 preflight request (預(yù)檢請(qǐng)求)的返回結(jié)果(即 Access-Control-Allow-Methods 和Access-Control-Allow-Headers 提供的信息) 可以被緩存的最長(zhǎng)時(shí)間,單位是秒背蟆。(MDN)
如果值為 -1鉴分,則表示禁用緩存,每一次請(qǐng)求都需要提供預(yù)檢請(qǐng)求带膀,即用OPTIONS請(qǐng)求進(jìn)行檢測(cè)志珍。