之前有乙個專案使用zepto
來傳送ajax
請求, 檢視nginx
日誌或使用chrome dev tools
檢視請求傳送情況時, 會看到每次調後台api的請求之前, 都會傳送乙個options請求, 無論api要求請求的方法是get或post.
為什麼會傳送這個options請求? 可以去掉嗎?
首先, 我在js**裡是沒寫要傳送options請求的, 後台api要的請求方法不是get就是post, 我只傳送過這兩種型別的請求.
那麼, 我就以為是zepto
搞的鬼, 於是去看它的原始碼.zepto
的原始碼模組化做得很好, 直接看裡面的ajax.js
檔案就好了. 結果, 我發現一切正常啊, 並沒有這種邏輯:傳送get/post請求之前, 先傳送乙個options請求.
不是zepto
的問題, 那我只好使用搜尋**了.
stackoverflow.com一搜, 找到了乙個相似的問題, 再根據回答找到mdn的文件, 這才知道前因後果.
眾所周知, ajax請求是由xmlhttprequest
物件實現的(ie10以下的瀏覽器不是), 而xmlhttprequest
會遵守同源策略(same-origin policy). 也即指令碼只能訪問相同協議/相同主機名/相同埠的資源, 如果要突破這個限制, 那就是所謂的跨域, 此時需要遵守cors(cross-origin resource sharing)機制
那麼, 允許跨域, 不就是服務端(例如nginx)設定access-control-allow-origin: *
就可以了嗎? 普通的請求才是這樣子的, 除此之外, 還一種叫請求叫preflighted request
preflighted request
在傳送真正的請求前, 會先傳送乙個方法為options的預請求(preflight request
), 用於試探服務端是否能接受真正的請求.
那麼, 什麼情況下請求會變成preflighted request
呢? 文件中指出的是:
請求方法不是get/head/post
請求設定了自定義的header
字段
有了上面的知識點, 再去看專案中ajax呼叫
12
3
4
5
6
7
8
9
10
$.ajax(,success:
function(data)
})
可以看出, 跨域請求中設定了自定義的header
字段, 所以該請求是preflighted request
, 則請求前一定會傳送乙個options作為預請求.
所以說, 在專案中ajax對後台api的呼叫, options請求是不可以去掉的, 除非後台介面不再需要在請求header
中設定openid
哈哈, 明白了這個道理就好辦啦, 後台同學再讓我把這個請求去掉, 我就說」臣妾做不到啊」
ajax中出現兩次請求
在專案中發現ajax中出現兩次請求,options請求和get請求,得到的資料出錯,所以想要去掉options請求。ajax請求如下 ajaxrequestget function lastpath,requestparams,successfun url this.baseurl lastpath...
problem 為什麼會有options請求
為了安全考慮,瀏覽器對資源訪問有同源限制的問題,也就是web應用程式只能訪問和它同一協議同一網域名稱同一埠的web應用程式上的資源。通過跨域資源共享機制可以讓資源在瀏覽器中訪問與該資源本身不同域的資源,資源會發起乙個跨域的http請求。瀏覽器傳送options請求是一種cors預檢測的行為,主要用來...
除錯中出現的問題
1.程式時編譯已經通過,連線時出現錯誤 error lnk2001 unresolved external symbol endthreadex nafxcwd.lib thrdcore.obj error lnk2001 unresolved external symbol beginthread...