HTTP Options 跨域時發送兩個請求是怎麼回事?

在正式的跨域請求之前,我們能在控制檯上看到先發送了一個 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,它表明了這個詢問結果的有效期,後面瀏覽器在有效期內也可以不必再次詢問

參考

推薦這家的文章,雖然有標題黨嫌疑,但講的的確是通俗易懂。

因爲一個跨域請求,我差點丟了飯碗

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章