Http協議:什么情況下發生了options請求?
背景:
新來的同事問我,我的項目中出現了很多options的請求,然后后臺服務都掛了,我不知道如何處理;
http協議
其實通過http方式我們最常用的就是:GET,POST; 他們都可以作為前端和后臺的數據交換使用;
options在什么情況下出現
- 跨域調用,例如:調試時候很多情況都在跨越方式下調試;
- 自定義頭部
- 請求頭的content-type參數:application/x-www-form-urlencoded,multipart/form-data,text/plain之外的格式
以上三種情況出現就會出現options請求了,說白就是為了服務器安全,例如:同源策略引發這個規則;
options通常是瀏覽器自動發起的,目的就是去服務器檢查一下接下來要到用的方法(GET、POST、PUT、detele)在服務器上是否支持;
對于服務器該如何處理
檢查以下內容
A:方式
- 來源是否允許
- 自定義的頭部是否包含(這個和你項目有關)
如果你項目認為是安全的,直接返回200狀態碼,就可以;
B:方式
- 來源是否允許
- 自定義的頭部是否包含(這個和你項目有關)
- 檢查content-type 的內容是否是你期望的
如果你項目認為是安全的,直接返回200狀態碼,就可以
如果不允許你可以放回狀態碼400或者其他;
options請求影響服務性能,如何優化
本來一個請求就搞定,結果頻繁多了很多options必然造成服務的壓力;
可以做到options請求做緩存處理,例如: http:// www.**.com/api/getUser 接口會出現 options請求,我們在options返回是做一次options緩存,告知前端以后在此請求這個接口就不要在發options了,服務器響應時可設置 Access-Control-Max-Age 的時間,默認10分鐘;
進一步理解options
和options有關的關鍵字段作用
- Access-Control-Request-Method:告知服務器,接下來請求將使用方法,例如POST
- Access-Control-Request-Headers:告知服務器,接下來請求將攜帶的自定義請求首部字段
MDN 中對于OPTIONS的描述
HTTP 的 OPTIONS 方法 用于獲取目的資源所支持的通信選項。客戶端可以對特定的 URL 使用 OPTIONS 方法,也可以對整站(通過將 URL 設置為“*”)使用該方法。”
