瀏覽器中的preflight請求-預檢請求

什么是preflight請求?

preflight愤兵,一個cors預檢請求鹿霸,屬于options請求。該請求會在瀏覽器認為即將要執(zhí)行的請求可能會對服務器造成不可預知的影響時秆乳,由瀏覽器自動發(fā)出懦鼠。
利用預檢請求,瀏覽器能夠知道當前的服務器是否允許執(zhí)行即將要進行的請求屹堰,只有獲得了允許肛冶,瀏覽器才會真正執(zhí)行接下來的請求。
所以双藕,總結有幾點:

  • 瀏覽器自動發(fā)出該請求淑趾,不需要用戶干預
  • 該請求發(fā)生在用戶發(fā)送的請求之前,只有預檢請求通過忧陪,用戶發(fā)送的請求才能發(fā)送到服務器扣泊,否則拋出CORS錯誤。

prefilght觸發(fā)條件

preflight預檢請求屬于cors規(guī)范的一部分嘶摊,是一種服務器驗證機制延蟹。目前所有瀏覽器都實現(xiàn)了該規(guī)范,但是不免有些瀏覽器會對規(guī)范內(nèi)容進行擴充叶堆。但是必須實現(xiàn)的規(guī)范是:只有以下條件滿足的情況下才不會發(fā)送預檢請求阱飘,否則會在發(fā)送用戶請求之前發(fā)送預檢請求,以免在獲得允許之前對服務器產(chǎn)生不可預知的影響虱颗。
條件有:

  1. 請求方法限制

只能使用GET沥匈、POST方法

  1. 請求頭限制

只能包含九種請求頭:

  • Accept
  • Accept-language
  • Content-Language
  • Content-Type
  • DPR
  • Downlink
  • Save-Data
  • Viewport-Width
  • Width
  1. Content-type限制

只能包含三種類型:

  • text/plain
  • multipart/form-data
  • application/x-www-form-urlencoded
  1. XMLHttpRequestUpload對象限制

該對象沒有注冊任何事件監(jiān)聽器

  1. ReadableStream對象限制

請求中不能使用ReadableStream對象

如果以上條件有一條不滿足,瀏覽器則會自動發(fā)起預檢請求

配置preflight請求

瀏覽器自動發(fā)送的預檢請求忘渔,一般采用三個字段來表示:

  • Origin:表示當前請求的訪問來源(域名)
  • Access-Control-Request-Headers:告知服務器實際請求所攜帶的自定義首部字段
  • Access-Control-Request-Methods:告知服務器實際請求所使用的 HTTP 方法

服務器基于從預檢請求獲得的信息來判斷高帖,是否接受接下來的實際請求。

所以服務器同時需要配置preflight響應來回應瀏覽器畦粮,告知瀏覽器是否接受預檢請求散址,主要涉及到三個字段:

  • Access-Control-Allow-Origin: 表示允許的訪問來源乖阵。或者可以使用"*" 表示允許所有的訪問來源预麸。這個字段一般用于對跨域請求的支持瞪浸。
  • Access-Control-Allow-Headers:表示允許的自定義請求頭。
  • Access-Control-Allow-Methods:表示允許的請求方式吏祸。

舉一個例子:

客戶端自定義了一個請求頭uname对蒲,內(nèi)容是admin。但是此時服務器端并沒有預檢請求的處理(這里使用node作為服務器端)

客戶端:


在這里插入圖片描述

服務器(由于是不同域犁罩,所以實現(xiàn)處理了跨域請求):


在這里插入圖片描述

結果:


在這里插入圖片描述

可以看到在發(fā)送用戶請求http://127.0.0.1:8000/server之前齐蔽,瀏覽器先發(fā)送了一個預檢請求,Type=preflight床估,而觸發(fā)預檢請求的原因是:客戶端在請求頭中添加了自定義請求頭含滴。但是由于服務器端沒有預檢請求的處理,所以瀏覽器沒有得到預檢請求的響應丐巫,就不會處理用戶本身要發(fā)送的請求谈况,因此可以看到/server這個請求出現(xiàn)了CORS ERROR

按照之前所理解的預檢請求,我們可以在服務器端進行配置對該請求的響應:

app.use('/server', (req,res,next) => {
    // 設置所有域都可以訪問該域的資源
    res.setHeader('Access-Control-Allow-Origin','*');
    // 設置允許的自定義請求頭
    res.setHeader('Access-Control-Allow-Headers', 'uname');
    next();
})

app.post('/server',(req,res) => {
    res.send('post');
})

注意:由于preflight請求屬于cors規(guī)范的一部分递胧,因此當前僅當跨域的情況下可能會觸發(fā)preflight碑韵。也即:只有跨域了,且不滿足之前觸發(fā)條件中一條就會觸發(fā)預檢請求缎脾。沒有跨域祝闻,不會觸發(fā)預檢請求。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末遗菠,一起剝皮案震驚了整個濱河市联喘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辙纬,老刑警劉巖豁遭,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贺拣,居然都是意外死亡蓖谢,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門譬涡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闪幽,“玉大人,你說我怎么就攤上這事涡匀」凳梗” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵渊跋,是天一觀的道長腊嗡。 經(jīng)常有香客問我,道長拾酝,這世上最難降的妖魔是什么燕少? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮蒿囤,結果婚禮上客们,老公的妹妹穿的比我還像新娘。我一直安慰自己材诽,他們只是感情好底挫,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著脸侥,像睡著了一般建邓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上睁枕,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天官边,我揣著相機與錄音,去河邊找鬼外遇。 笑死注簿,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的跳仿。 我是一名探鬼主播诡渴,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼菲语!你這毒婦竟也來了妄辩?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤谨究,失蹤者是張志新(化名)和其女友劉穎恩袱,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胶哲,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡畔塔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸯屿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澈吨。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖寄摆,靈堂內(nèi)的尸體忽然破棺而出谅辣,到底是詐尸還是另有隱情,我是刑警寧澤婶恼,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布桑阶,位于F島的核電站柏副,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蚣录。R本人自食惡果不足惜割择,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望萎河。 院中可真熱鬧荔泳,春花似錦、人聲如沸虐杯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽擎椰。三九已至支子,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間确憨,已是汗流浹背译荞。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留休弃,地道東北人吞歼。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像塔猾,于是被迫代替她去往敵國和親篙骡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容