options 方法比較少見,該方法用於請求伺服器告知其支援哪些其他的功能和方法。通過 options 方法,可以詢問伺服器具體支援哪些方法,或者伺服器會使用什麼樣的方法來處理一些特殊資源。可以說這是乙個探測性的方法,客戶端通過該方法可以在不訪問伺服器上實際資源的情況下就知道處理該資源的最優方式。
既然比較少見,什麼情況下會使用這個方法呢?
最近在做跨域檔案上傳的時候,瀏覽器會自動發起乙個 options 方法到伺服器。
如果只是普通的 ajax 請求,也不會發起這個請求,只有當 ajax 請求繫結了 upload 的事件並且跨域的時候,就會自動發起這個請求。
上面的**是在 ***.com 域下發起了乙個跨域的 post 請求,期望提交資料到 api.***.com 這個網域名稱的伺服器,同時在提交資料的時候希望能監測到檔案上傳的實時進度。
自動發起的 options 請求,其請求頭包含了的一些關鍵性字段:
在這種場景下,客戶端發起的這個 options 可以說是乙個「預請求」,用於探測後續真正需要發起的跨域 post 請求對於伺服器來說是否是安全可接受的,因為跨域提交資料對於伺服器來說可能存在很大的安全問題。
請求頭 access-control-request-method 用於提醒伺服器在接下來的請求中將會使用什麼樣的方法來發起請求。
那麼在服務端應該如何處理這個 options 請求呢?
這裡以 node.js 伺服器的 koa 框架為例。在服務端會增加乙個 options 方法的 /upload 路由來處理客戶端的這個請求。
koa 中使用了乙個比較受歡迎的 koa-router 中介軟體來處理路由,但是該中介軟體對 options 方法預設的處理方式會有點問題。因為在響應上面的 options 請求時,需要新增上用於訪問控制的響應頭。
響應頭中關鍵性的字段:
access-control-allow-methods 和 access-control-allow-origin 分別告知客戶端,伺服器允許客戶端用於跨域的方法和網域名稱。而 access-control-allow-headers 用於告知客戶端允許在傳送請求時允許新增或修改的請求頭。
node.js 的路由**會是這樣的:
1
router.options(
'/upload'
, function* ());
上面倒數第二行的**也很重要,設定響應狀態碼為 204 是為了告知客戶端表示該響應成功了,但是該響應並沒有返回任何響應體,如果狀態碼為 200,還得攜帶多餘的響應體,在這種場景下是完全多餘的,只會浪費流量。
關於 204 狀態碼的意義我經常會在面試的時候問起,這裡就是乙個實際應用的例子 ^_^
好了,options 的請求處理完了,剩下的 post 請求就簡單了,只需在響應頭中新增一條和 options 一致的允許跨域的網域名稱即可,這裡就不重複貼上**了。
原載於:雨夜帶刀』s blog
http跨域時的options請求
一 簡介 出於安全考慮,並不是所有網域名稱訪問後端服務都可以。其實在正式跨域之前,瀏覽器會根據需要發起一次預檢 也就是option請求 用來讓服務端返回允許的方法 如get post 被跨域訪問的origin 或者域 還有是否需要credentials 認證資訊 等。那麼瀏覽器在什麼情況下能預檢呢?...
java 跨域解決(OPTIONS)
一般跨域解決只需要在tomcat conf下web.xml 裡面設定 corsfilter org.apache.catalina.filters.corsfilter cors.allowed.origins cors.allowed.methods get,post,head,options,p...
其他跨域請求方法
除了jsonp這個主流的解決方案外,還有其他四個常用的跨域請求方案適用於不同的場景。ping 可以從任何url中載入,故將img的src設定成其他域的url,即可實現跨域。還有乙個注意的地方是的載入是非同步的,所以把的渲染必須放到回掉函式onload中,具體看以下示例 cors 跨資源共享 ie例項...