咱們會發現,在不少post,put,delete等請求以前,會有一次options請求。javascript
根本緣由就是,W3C規範這樣要求了!在跨域請求中,分爲簡單請求(get和部分post,post時content-type屬於application/x-www-form-urlencoded,multipart/form-data,text/plain中的一種)和複雜請求。而複雜請求發出以前,就會出現一次options請求。java
什麼是options請求呢?它是一種探測性的請求,經過這個方法,客戶端能夠在採起具體資源請求以前,決定對該資源採起何種必要措施,或者瞭解服務器的性能。jquery
在ajax中出現options請求,也是一種提早探測的狀況,ajax跨域請求時,若是請求的是json,就屬於複雜請求,所以須要提早發出一次options請求,用以檢查請求是不是可靠安全的,若是options得到的迴應是拒絕性質的,好比404\403\500等http狀態,就會中止post、put等請求的發出。ajax
雖然在下面的參考文獻中有人提出能夠取消options請求,可是實測後發現是不行的,jquery封裝以後,更不能輕易取消。所以,靠javascript客戶端取消options請求是不可能的,只能經過服務端對options請求作出正確的迴應,這樣才能保證options請求以後,post、put等請求能夠被髮出。可是,咱們不能容許全部的options請求,而應該是有條件的,因此最好是經過一個特殊的機制,去驗證客戶端發出的options請求數據是不是符合服務端的條件的,若是不知足,返回403,則客戶端會取消原有的post計劃。json
前臺跨域post請求,因爲CORS(cross origin resource share)規範的存在,瀏覽器會首先發送一次options嗅探,同時header帶上origin,判斷是否有跨域請求權限,服務器響應access control allow origin的值,供瀏覽器與origin匹配,若是匹配則正式發送post請求。跨域
若是有服務器程序權限,設置,好比jsp中,設置header access control allow origin等於*,就能夠獲得跨域訪問的目的。瀏覽器