在正式的跨域請求之前,我們能在控制檯上看到先發送了一個 OPTIONS 請求去詢問服務器是否允許接下來的跨域請求,那麼有關於這個 OPTIONS,今天就來介紹一下。
在 OPTIONS 請求裏有幾個字段:
- Origin:發起請求原來的域
- Access-Control-Request-Method:將要發起的跨域請求方式(GET/PUT/POST/DELETE/······)
- Access-Control-Request-Headers:將要發起的跨域請求中包含的請求頭字段
- Access-Control-Max-Age:緩存查詢結果時間。
服務器在響應字段中來表明是否允許這個跨域請求,瀏覽器收到後檢查如果不符合要求,就拒絕後面的請求
- Access-Control-Allow-Origin:允許哪些域來訪問(*表示允許所有域的請求)
- Access-Control-Allow-Methods:允許哪些請求方式
- Access-Control-Allow-Headers:允許哪些請求頭字段
- Access-Control-Allow-Credentials:是否允許攜帶Cookie
爲了避免每次都要詢問,OPTIONS 還做了兩個重要的優化
第一,如果是一個簡單請求,那就直接發起請求,只需在請求中加入 Origin 字段表明自己來源,在響應中檢查 Access-Control-Allow-Origin,如果不符合要求就報錯,不需要再單獨詢問
那簡單請求又是什麼?
簡單請求就是請求方式屬於HEAD、GET、POST三者之一,請求頭只有下面這些,不符合要求的就是非簡單請求,就得詢問了
- Accept
- Accept-Language
- Content-Language
- Last-Event-ID
- Content-Type:(application/x-www-form-urlencoded、multipart/form-data、text/plain)
第二個優化是,Options 請求頭的 Access-Control-Max-Age,它表明了這個詢問結果的有效期,後面瀏覽器在有效期內也可以不必再次詢問
參考
推薦這家的文章,雖然有標題黨嫌疑,但講的的確是通俗易懂。