AJAX跨域POST發送json時,會發送一個options預請求

    我們會發現,在很多post,put,delete等請求之前,會有一次options請求。

 

    根本原因就是,W3C規範這樣要求了,在跨域請求中,分爲簡單請求(get和部分post,post時content-type屬於application/x-www-form-urlencoded,multipart/form-data,text/plain中的一種)和複雜請求。而複雜請求發出之前,就會出現一次options請求。

    什麼是options請求呢?它是一種探測性的請求,通過這個方法,客戶端可以在採取具體資源請求之前,決定對該資源採取何種必要措施,或者瞭解服務器的性能。

   在ajax中出現options請求,也是一種提前探測的情況,ajax跨域請求時,如果請求的時json,就屬於複雜請求,因此需要提前發出一次options請求,用以檢查請求是否是可靠安全的,如果options獲得的迴應是拒絕性質的,比如404\403\500等http狀態,就會停止post、put等請求的發出。

    雖然有人提出可以取消options請求,但是實測後發現是不行的,jquery封裝之後,更不能輕易取消。因此,靠javascript客戶端取消options請求是不可能的,只能通過服務端對options請求做出正確的迴應,這樣才能保證options請求之後,post、put等請求可以被髮出。但是,我們不能允許所有的option請求,而應該時有條件的,所以最好是通過一個特殊的機制,去驗證客戶端發出的options請求數據是否符合服務端的條件的,如果不滿足,返回403,則客戶端會取消原有的post計劃。

   前臺跨域post請求,由於CORS(cross origin resource share)規範的存在,遊覽器會首先發送一次options嗅探,同時header帶上origin,判斷是否有跨域請求權限,服務器響應access control allow origin的值,供遊覽器與origin匹配,如果匹配則正式發送post請求。

   如果有服務器程序權限,設置,比如jsp中,設置header access control allow origin等於*,就可以得到跨域訪問的目的。

參考博客https://www.cnblogs.com/ermaoblog/p/8855915.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章