Options 請求十办,我所了解的就是在發(fā)起跨域的非簡單請求時,會先發(fā)起一個 options 預檢請求(瀏覽器是自動發(fā)起的),去檢測目標服務器是支持跨域請求。
什么是 Options 請求路克?
- 獲取服務器支持的 http 請求方法
響應報文包含一個 Allow
首部字段樟结,該字段的值表明了服務器支持的所有 HTTP 方法
- 跨域請求的預檢請求
Options 預檢請求
在 CORS 中,可以使用 OPTIONS 方法發(fā)起一個預檢請求精算,以檢測實際請求是否可以被服務器所接受瓢宦。
關鍵請求頭
Options 請求會攜帶幾個關鍵的 Request Header
Request Header | 作用 |
---|---|
Access-Control-Request-Method | 告訴服務器實際請求所使用的 HTTP 方法 |
Access-Control-Request-Headers | 告訴服務器實際請求所攜帶的自定義首部字段 |
Origin | 發(fā)起請求的域名 (協(xié)議、域名灰羽、端口號) |
服務器基于從預檢請求獲得的信息來判斷驮履,是否接受接下來的實際請求。
關鍵響應頭
預檢響應頭 response header 的關鍵字段
response header | 作用 |
---|---|
Access-Control-Allow-Methods | 返回了服務端允許的請求谦趣,包含 GET/HEAD/PUT/PATCH/POST/DELETE |
Access-Control-Allow-Credentials | 允許跨域攜帶 cookie(跨域請求要攜帶 cookie 必須設置為 true) |
Access-Control-Allow-Origin | 允許跨域請求的域名疲吸,這個可以在服務端配置一些信任的域名白名單 |
Access-Control-Allow-Headers | 客戶端請求所攜帶的自定義首部字段 |
此次 OPTIONS 請求返回了響應頭的內容,但沒有返回響應實體 response body 內容前鹅。
Options 請求后的第二次請求
這個才是我們真正要發(fā)送的請求
關于 Options 請求
Options 請求是瀏覽器自動發(fā)起的
跨域請求觸發(fā)了瀏覽器自動發(fā)起 OPTIONS 請求。
跨域請求時峭梳,OPTIONS 請求觸發(fā)條件
跨域的非簡單請求會觸發(fā)預檢請求
那么滿足哪些條件的請求是非簡單請求呢舰绘?
- 使用了下面任意一個請求方法
PUT/DELETE/CONNECT/OPTIONS/TRACE/PATCH
- 人為設置了以下集合之外首部字段
Accept/Accept-Language/Content-Language/Content-Type/DPR/Downlink/Save-Data/Viewport-Width/Width
- Content-Type 的值不屬于下列之一:
application/x-www-form-urlencoded、multipart/form-data葱椭、text/plain
優(yōu)化 Options 請求
可見一旦達到觸發(fā)條件捂寿,跨域請求便會一直發(fā)送 2 次請求,這樣增加的請求數(shù)是否可優(yōu)化呢孵运?答案是可以秦陋,OPTIONS 預檢請求的結果可以被緩存。
Access-Control-Max-Age 這個響應首部表示 preflight request (預檢請求)的返回結果(即 Access-Control-Allow-Methods 和 Access-Control-Allow-Headers 提供的信息) 可以被緩存的最長時間治笨,單位是秒驳概。
如果值為 -1,則表示禁用緩存旷赖,每一次請求都需要提供預檢請求顺又,即用 OPTIONS 請求進行檢測。
總結
OPTIONS 請求即預檢請求等孵,可用于檢測服務器允許的 http 方法稚照。當發(fā)起跨域請求時,由于安全原因俯萌,觸發(fā)一定條件時瀏覽器會在正式請求之前自動先發(fā)起 OPTIONS 請求果录,即 CORS 預檢請求,服務器若接受該跨域請求咐熙,瀏覽器才繼續(xù)發(fā)起正式請求弱恒。