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