1.什么是options請求?
- http的options方法 使用獲取目的資源所支持的通信選項。
- 作用有二:1.檢測服務器支持哪些 HTTP 方法;2.用來檢查服務器的性能。比如向另一個域名發送options請求,用以判斷發送的請求是否安全
預檢請求報文中的首部字段 Access-Control-Request-Method
首部字段告知服務器實際請求所使用的 HTTP 方法預檢請求報文中的首部字段 Access-Control-Request-Headers
告知服務器實際請求所攜帶的自定義首部字段- 服務器基於從預檢請求獲得的信息來判斷,是否接受接下來的實際請求。
- 如上圖,相應報文中 【allow】字段的值表明了服務器支持的所有http方法
- 服務器所返回的
Access-Control-Allow-Methods
首部字段將所有允許的請求方法告知客戶端,同allow類似
2.為什么會有options請求?
主要是cors為了解決瀏覽器同源策略和跨域。
解決跨域問題的方法有很多種,CORS是比較普遍使用也比較好的解決方案。
CORS是一種網絡瀏覽器的技術規范,它為Web服務器定義了一種方式,允許網頁從不同的域訪問其資源。而這種訪問是被同源策略所禁止的。
CORS系統定義了一種瀏覽器和服務器交互的方式來確定是否允許跨域請求。實現CORS通信的關鍵是服務器。只要服務器實現了CORS接口,就可以跨源通信。整個CORS通信過程,都是瀏覽器自動完成,不需要用戶參與。
3.什么時候會發送options請求呢?
瀏覽器將CORS請求分成兩類:簡單請求(simple request)和非簡單請求(not-so-simple request)。
只要同時滿足以下兩大條件,就屬於簡單請求。
(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
凡是不同時滿足上面兩個條件,就屬於非簡單請求。
瀏覽器對這兩種請求的處理,是不一樣的。
=======但是項目中,設置axios的content-type:application/json的get請求,並沒有發出options請求,
=======get請求沒有請求體,無法攜帶content-type
3.如何減少options請求?
Access-Control-Max-Age:1800
首部字段 Access-Control-Max-Age
表明該響應的有效時間,單位是【秒】,瀏覽器自身維護了一個最大有效時間,如果該首部字段的值超過了最大有效時間,將不會生效。
Access-Control-Max-Age:-1時,將禁用options請求,需要對所有呼叫進行預檢選項檢查。
4.前端未發送options請求
1) 確認是否為非簡單請求
2) 確認是否在Access-Control-Max-Age緩存時效內