瀏覽器-OPTIONS 預請求

1. HTTP一共有八種常見請求方法
  1. get:參數在url上,瀏覽器長度有限制,不安全
  2. post:參數不可見,長度不受限制
  3. put:上傳最新內容到指定位置
  4. delete:刪除請求的url所表示的資源
  5. head:不返回相應主體,主要用於客戶端查看服務器性能
  6. options:與head類似,是客戶端用於查看服務器的性能 。JavaScript的XMLHttpRequest對象進行CORS跨域資源共享時,就是使用OPTIONS方法發送嗅探請求,以判斷是否有對指定資源的訪問權限
  7. connect:http1.1預留的,將連接方式改爲管道方式,通常用於SSL加密服務器的鏈接與 HTTP非加密的代理服務器之間的通信
  8. trace:請求服務器[回顯收到的請求信息]主要用於HTTP請求的測試或診斷
  9. patch:出現的較晚,用於更新局部的資源,不存在時,會創建一個新的(http1.1之後使用的較多的)
2. 什麼是預請求

請求分爲簡單請求和預檢請求,options請求也稱爲預檢請求,也可以說是複雜請求(可能對服務器數據產生副作用的HTTP請求方法,如put,delete都會對服務器數據進行更修改,所以瀏覽器必須首先使用 OPTIONS 方法發起一個預檢請求(preflight request),從而獲知服務端是否允許該跨域請求)。
如果我們發送的跨域請求爲“非簡單請求”,瀏覽器會在發出此請求之前首先發送一個請求類型爲OPTIONS的“預檢請求”,驗證請求源是否爲服務端允許源,這些過程對於開發者來說是感覺不到的,由瀏覽器代理。

3. options作用
  1. 獲取服務器支持的HTTP請求方法;也是黑客經常使用的方法。
  2. 用來檢查服務器的性能。例如:AJAX進行跨域請求時的預檢,需要向另外一個域名的資源發送一個options請求頭,用以判斷實際發送的請求是否安全。
4. 什麼情況下發生?(以下都屬於複雜請求)
  1. 請求方法不是 get、head、post
  2. content-type不是 application/x-www-form-urlencoded、multipart/form-data、text/plain
  3. 請求設置了自定義的header字段
5. 優化OPTIONS請求:Access-Control-Max-Age 或者 避免觸發

一旦達到觸發條件,跨域請求便會一直髮送2次請求,這樣增加的請求數是否可優化呢?答案是可以,OPTIONS預檢請求的結果可以被緩存。

Access-Control-Max-Age這個響應首部表示 preflight request (預檢請求)的返回結果(即 Access-Control-Allow-Methods 和Access-Control-Allow-Headers 提供的信息) 可以被緩存的最長時間,單位是秒。(MDN)

如果值爲 -1,則表示禁用緩存,每一次請求都需要提供預檢請求,即用OPTIONS請求進行檢測。

6. 請求的過程
1. 請求頭中的字段
  1. 預檢請求頭request header的關鍵字段

    Request Header 作用
    Access-Control-Request-Method 告訴服務器實際請求所使用的 HTTP 方法
    Access-Control-Request-Headers 告訴服務器實際請求所攜帶的自定義首部字段,本次實際請求首部字段中content-type爲自定義
  2. 預檢響應頭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-Request-Headers 客戶端請求所攜帶的自定義首部字段content-type
2.簡單請求

瀏覽器判斷跨域爲簡單請求時候,會在Request Header中添加 Origin (協議 + 域名 + 端口)字段 , 它表示我們的請求源,服務端會將該字段作爲跨源標誌。

服務端接收到此次請求後 , 首先會判斷Origin是否在允許源(由服務端決定)範圍之內,如果驗證通過,服務端會在Response Header 添加 Access-Control-Allow-Origin、Access-Control-Allow-Credentials等字段。

必須字段:

Access-Control-Allow-Origin:表示服務端允許的請求源,*標識任何外域,多個源 , 分隔

可選字段:

Access-Control-Allow-Credentials:false 表示是否允許發送Cookie。設置爲true,同時ajax請求設置withCredentials = true,瀏覽器的cookie就能發送到服務端;

3. 非簡單請求

進行非簡單請求時候 , 瀏覽器會首先發出類型爲OPTIONS的“預檢請求”,服務端對“預檢請求”處理,並對Response Header添加驗證字段,客戶端接受到預檢請求的返回值進行一次請求預判斷,驗證通過後,主請求發起。

4 總結:

預檢請求通過後,主請求與簡單請求一致。

非簡單請求需要服務端對OPTIONS類型的請求做處理。

如果Request Headers中設置了自定義這個屬性,如Authorization ,所以預檢請求的Request Headers中的Access-Control-Request-Headers的值也要追加 Authorization

參考鏈接:

  1. Header增加字段導致跨域OPTIONS請求不成功
  2. 什麼時候會發送options請求
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章