HTTP 之 options預請求

1、HTTP一共有八種常見請求方法

  1. get:參數在url上,瀏覽器長度有限制,不安全
  2. post:參數不可見,長度不受限制
  3. put:上傳最新內容到指定位置
  4. delete:刪除請求的url所表示的資源
  5. head:不返回相應主體,主要用於客戶端查看服務器性能
  6. options:與head相似,是客戶端用於查看服務器的性能 。JavaScript的XMLHttpRequest對象進行CORS跨域資源共享時,就是使用OPTIONS方法發送嗅探請求,以判斷是否有對指定資源的訪問權限
  7. connect:http1.1預留的,將鏈接方式改成管道方式,一般用於SSL加密服務器的連接與 HTTP非加密的代理服務器之間的通訊
  8. trace:請求服務器[回顯收到的請求信息]主要用於HTTP請求的測試或診斷
  9. patch:出現的較晚,用於更新局部的資源,不存在時,會建立一個新的(http1.1以後使用的較多的)

通常來講咱們只須要用到post和get,可是若是後端是ResetFul設計規範下就須要用到各類語義化的方法了nginx

2、什麼是預請求?

預請求就是複雜請求(可能對服務器數據產生反作用的HTTP請求方法,如put,delete都會對服務器數據進行更修改,因此要先詢問服務器)。
跨域請求中,瀏覽器自發的發起的預請求,瀏覽器會查詢到兩次請求,第一次的請求參數是options,以檢測試實際請求是否能夠被瀏覽器接受web

3、爲何須要?

w3c規範要求,對複雜請求,瀏覽器必須先使用options發起一個預檢請求,從而獲知服務器是否容許該跨域請求,服務器確認之後才能發起實際的HTTP請求,不然中止第二次正式請求。ajax

那爲何咱們不常見options請求呢??
由於大部分咱們使用的是get,post請求,他們屬於簡單請求,而簡單請求不會觸發options請求。
那什麼狀況下會發生options請求呢???👇spring

4、什麼狀況下發生?(如下都屬於複雜請求)

  1. 請求方法不是get head post
  2. post 的content-type不是application/x-www-form-urlencode,multipart/form-data,text/plain [也就是把content-type設置成"application/json"]
  3. 請求設置了自定義的header字段: 好比業務需求,傳一個字段,方面後端獲取,不須要每一個接口都傳

例如設置了post請求的content-type:application/json,就會發生預請求 json

5、爲何須要設置成contentType:"application/json"

ajax發送複雜的json數據結構, 處理方式困難, 服務器端難以解析, 因此就有了application/json這種類型(數據格式的聲明)服務端好解析而且比較統一,若是你請求中沒有設置成json格式的,有的服務端收到後也會改爲json格式的,可是如何請求中就改爲了json格式的就會發生options預請求後端

if設置了:

  • 表示json格式的字符串,發送的json對象必須使用json.stringify進行序列化字符串才能匹配
  • spring 須要使用@RequestBody來註解

if沒設置:

  • 默認將使用contentType: "application/json」application/x-www-form-urlencoded

6、須要配置什麼?

在 CORS 中,可使用 OPTIONS 方法發起一個預檢請求,服務器基於從預檢請求得到的信息來判斷,以檢測實際請求是否能夠被服務器所接受。跨域

1.預請求的請求報文中要設置👇

  • Access-Control-Request-Method首部字段: 告知服務器實際請求所使用的 HTTP 方法;
  • Access-Control-Request-Headers首部字段: 告知服務器實際請求所攜帶的自定義首部字段。

2.同時服務端或者nginx 須要設置響應體👇

"Access-Control-Allow-Origin" : * 【跨域】
Access-Control-Allow-Methods:POST,GET,OPTIONS,DELEDET 【所容許的請求方法告知客戶端】
Access-Control-Allow-Headers: X-Requested-With, accept, origin, content-type【自定義的請求頭】
Access-Control-Allow-Age:3600  
【一段時間內不須要再次預請求,直接用本次結果便可】
"Content-Type", "application/json;charset=utf-8"
複製代碼

eg1

7、options做用

OPTIONS請求方法的主要用途有兩個:瀏覽器

  1. 獲取服務器支持的HTTP請求方法;也是黑客常用的方法。
  2. 用來檢查服務器的性能。例如:AJAX進行跨域請求時的預檢,須要向另一個域名的資源發送一個options請求頭,用以判斷實際發送的請求是否安全。

8、跨域方法:

  • JSONP跨域:動態生成script標籤,只支持get請求,可是兼容性比較好能夠支持老瀏覽器
  • CORS跨源資源共享:options請求作嗅探
  • webSockted:全雙工通訊
  • img src :不受瀏覽器的同源限制
相關文章
相關標籤/搜索