跨域避免 option 請求


悟空H5專題采用的是前后端分離方案,服務器域名和專題域名不一致,會受到瀏覽器同源策略影響。

 

我們發現數據主接口會發起兩次,其中第一個請求為預檢請求。

 

一般來說使用 application/json 的 post 請求是必然會帶入 OPTION 請求,何為 OPTION 預檢:

用於獲取目的資源所支持的通信選項。客戶端可以對特定的 URL 使用 OPTIONS 方法,也可以對整站(通過將 URL 設置為“*”)使用該方法。

 

在 CORS 中,可以使用 OPTIONS 方法發起一個預檢請求,以檢測實際請求是否可以被服務器所接受。預檢請求報文中的 Access-Control-Request-Method 首部字段告知服務器實際請求所使用的 HTTP 方法;Access-Control-Request-Headers 首部字段告知服務器實際請求所攜帶的自定義首部字段。服務器基於從預檢請求獲得的信息來判斷,是否接受接下來的實際請求。

 

有趣的是專題詳情為 GET 接口,為何 GET 請求也會發起 option 預檢?

 

這個原因得從簡單請求和復雜請求說起,跨域請求分為簡單和復雜兩種:

 

簡單請求:

 

請求方式為如下之一:

HEAD

GET

POST

 

HTTP 請求頭只能包含如下信息:

Accept

Accept-Language 

Content-Language 

Last-Event-ID 

Content-Type,但僅能是下列之一 

application/x-www-form-urlencoded 

multipart/form-data 

text/plain

 

任何一個不滿足上述要求的請求,即被認為是復雜請求。一個復雜請求不僅有包含通信內容的請求,同時也包含預檢信息。

 

 

 

 

專題配置接口請求頭中帶有自定義 header,瀏覽器會認定為非簡單請求,需要向服務器發出檢查,判斷該域名是否允許跨域。

 

經過分析發現,自定義 header 其實在此業務場景中非必傳自帶,發出預檢請求至少會有 100ms 的耗時,無形中延長頁面繪制時間。

 

最終解決方案:去除自定義header,修改為簡單請求,避免該請求發出預檢


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM