http 一次跨域請求出現 OPTIONS 請求的問題及解決方法

在正式跨域的請求前,瀏覽器會根據需要,發起一個“PreFlight”(也就是Option請求),用來讓服務端返回允許的方法(如get、post),被跨域訪問的Origin(來源,或者域),還有是否需要Credentials(認證信息) 三種場景:

如果跨域的請求是Simple Request(簡單請求 ),則不會觸發“PreFlight”。Mozilla對於簡單請求的要求是: 以下三項必須都成立:

  1. 只能是Get、Head、Post方法

  2. 除了瀏覽器自己在Http頭上加的信息(如Connection、User-Agent),開發者只能加這幾個:Accept、Accept-Language、Content-Type、。。。。

  3. Content-Type只能取這幾個值: application/x-www-form-urlencoded multipart/form-data text/plain

XHR對象對於HTTP跨域請求有三種:簡單請求、Preflighted 請求、Preflighted 認證請求。簡單請求不需要發送OPTIONS嗅探請求,但只能按發送簡單的GET、HEAD或POST請求,且不能自定義HTTP Headers。Preflighted 請求和認證請求,XHR會首先發送一個OPTIONS嗅探請求,然後XHR會根據OPTIONS請求返回的Access-Control-*等頭信息判斷是否有對指定站點的訪問權限,並最終決定是否發送實際請求信息。 那麼我的get請求呢? 原來,產生 OPTIOINS 請求的原因是:自定義 Headers 頭信息導致的。 瀏覽器會去向 Server 端發送一個 OPTIONS 請求,看 Server 返回的 "Access-Control-Allow-Headers" 是否有自定義的 header 字段。因爲我之前沒有返回自定義的字段,所以,默認是不允許的,造成了客戶端沒辦法拿到數據。

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