http跨域請(qǐng)求過程發(fā)出兩次請(qǐng)求options請(qǐng)求,修改請(qǐng)求頭未生效

????????XMLHttpRequest遵守同源策略(same-origin policy)慎颗,導(dǎo)致我們?cè)诓煌吹那闆r下未必可以成功請(qǐng)求道服務(wù)器端的接口腹泌。在請(qǐng)求接口發(fā)生的過程中嘶卧,瀏覽器會(huì)根據(jù)需要發(fā)起一次預(yù)檢(也就是option請(qǐng)求),用來讓服務(wù)端返回允許的方法(如get凉袱、post)芥吟,被跨域訪問的Origin(來源或者域),還有是否需要Credentials(認(rèn)證信息)等专甩。

option請(qǐng)求:

????????由CORS引發(fā)的option請(qǐng)求钟鸵,什么是options請(qǐng)求呢?它是一種探測(cè)性的請(qǐng)求涤躲,通過這個(gè)方法棺耍,客戶端可以在采取具體資源請(qǐng)求之前,覺得采取什么樣的請(qǐng)求方式或者了解服務(wù)器性能种樱,黑客常見的辦法就是用option來試探蒙袍。

????????在ajax跨域請(qǐng)求時(shí)俊卤,如果請(qǐng)求的是json,或者一些其他‘非簡(jiǎn)單請(qǐng)求’左敌,此時(shí)需要提前發(fā)出一次options請(qǐng)求瘾蛋,用以檢查請(qǐng)求是否是可靠安全的俐镐,如果options獲得的回應(yīng)是拒絕性質(zhì)的矫限,比如404\403\500等http狀態(tài),就會(huì)停止post佩抹、put等請(qǐng)求的發(fā)出叼风,或者報(bào)錯(cuò)。


????????跨域資源共享(CORS) 是一種機(jī)制棍苹,它使用額外的 HTTP 頭來告訴瀏覽器 讓運(yùn)行在一個(gè) origin (domain) 上的Web應(yīng)用被準(zhǔn)許訪問來自不同源服務(wù)器上的指定的資源无宿。當(dāng)一個(gè)資源從與該資源本身所在的服務(wù)器不同的域或端口請(qǐng)求一個(gè)資源時(shí),資源會(huì)發(fā)起一個(gè)跨域 HTTP 請(qǐng)求枢里。

????????比如孽鸡,站點(diǎn) http://domain-a.com 的某 HTML 頁(yè)面通過的 src 請(qǐng)求 http://domain-b.com/image.jpg。網(wǎng)絡(luò)上的許多頁(yè)面都會(huì)加載來自不同域的CSS樣式表栏豺,圖像和腳本等資源彬碱。need-to-insert-img

????????出于安全原因,瀏覽器限制從腳本內(nèi)發(fā)起的跨源HTTP請(qǐng)求奥洼。 例如巷疼,XMLHttpRequest和Fetch API遵循同源策略。 這意味著使用這些API的Web應(yīng)用程序只能從加載應(yīng)用程序的同一個(gè)域請(qǐng)求HTTP資源灵奖,除非使用CORS頭文件嚼沿。


試探后報(bào)錯(cuò)跨域

????????瀏覽器將CORS請(qǐng)求分為兩類:簡(jiǎn)單請(qǐng)求(simple request)和非簡(jiǎn)單請(qǐng)求(not-simple-request),簡(jiǎn)單請(qǐng)求瀏覽器不會(huì)預(yù)檢,而非簡(jiǎn)單請(qǐng)求會(huì)預(yù)檢瓷患。

同時(shí)滿足下列三大條件骡尽,就屬于簡(jiǎn)單請(qǐng)求,否則屬于非簡(jiǎn)單請(qǐng)求

1.請(qǐng)求方式只能是:GET擅编、POST攀细、HEAD

2.HTTP請(qǐng)求頭限制這幾種字段:Accept、Accept-Language沙咏、Content-Language辨图、Content-Type、Last-Event-ID

3.Content-type只能戎辍:application/x-www-form-urlencoded故河、multipart/form-data、text/plain

如圖:常見的簡(jiǎn)單請(qǐng)求(只發(fā)出一次)


簡(jiǎn)單請(qǐng)求

非簡(jiǎn)單請(qǐng)求(只發(fā)出兩次)


非簡(jiǎn)單請(qǐng)求

簡(jiǎn)單請(qǐng)求:

????????對(duì)于簡(jiǎn)單請(qǐng)求瀏覽器直接請(qǐng)求吆豹,會(huì)在請(qǐng)求頭信息中鱼的,增加一個(gè)origin字段理盆,來說明本次請(qǐng)求來自哪個(gè)源(協(xié)議+域名+端口)。服務(wù)器根據(jù)這個(gè)值凑阶,來決定是否同意該請(qǐng)求猿规,服務(wù)器返回的響應(yīng)會(huì)多幾個(gè)頭信息字段:

1.Access-Control-Allow-Origin:該字段是必須的,如果后臺(tái)將其設(shè)置為* 表示接受任意域名的請(qǐng)求宙橱,還可以指定域名姨俩。(表示允許訪問的外域請(qǐng)求)

2.Access-Control-Allow-Credentials:該字段可選,是個(gè)布爾值师郑,表示是否可以攜帶cookie环葵,(注意:如果Access-Control-Allow-Origin字段設(shè)置*,此字段設(shè)為true無效)

3.Access-Control-Allow-Headers:該字段可選宝冕,里面可以獲取Cache-Control张遭、Content-Type、Expires等地梨,如果想要拿到其他字段菊卷,就可以在這個(gè)字段中指定。比如圖中指定的GUAZISSO(表示實(shí)際請(qǐng)求中宝剖,用戶請(qǐng)求的頭部信息


官方解釋

4.Access-Control-Expose-Headers:該字段可選洁闰。CORS請(qǐng)求時(shí),XMLHttpRequest對(duì)象的getResponseHeader()方法只能拿到6個(gè)基本字段:Cache-Control诈闺、Content-Language渴庆、Content-Type、Expires雅镊、Last-Modified襟雷、Pragma。如果想拿到其他字段仁烹,就必須在Access-Control-Expose-Headers里面指定耸弄。上面的例子指定,getResponseHeader('FooBar')可以返回FooBar字段的值卓缰。(首部字段用于預(yù)檢請(qǐng)求的響應(yīng)计呈。其指明了實(shí)際請(qǐng)求中允許攜帶的首部字段,允許用戶頭部攜帶(修改)哪些字段


官方解釋

非簡(jiǎn)單請(qǐng)求:

? ??????對(duì)服務(wù)器有特殊要求的請(qǐng)求的征唬,例如請(qǐng)求方式是PUT或者DELETE捌显,或者自己配置請(qǐng)求頭要求修改Content-Type字段類型是application/json。都會(huì)在正式通信之前总寒,增加一次HTTP請(qǐng)求扶歪,稱之為預(yù)檢。瀏覽器會(huì)先詢問服務(wù)器摄闸,當(dāng)前網(wǎng)頁(yè)所在域名是否在服務(wù)器的許可名單之中善镰,服務(wù)器允許之后妹萨,瀏覽器會(huì)發(fā)出正式的XMLHttpRequest請(qǐng)求,否則會(huì)報(bào)錯(cuò)炫欺。


案例詳解:

? ? ? ? 如下圖:一個(gè)post請(qǐng)求乎完,里面設(shè)置了‘content-type’類型為application/json。是一個(gè)非簡(jiǎn)單請(qǐng)求品洛,瀏覽器發(fā)起了OPTIONS預(yù)請(qǐng)求树姨。


發(fā)起非簡(jiǎn)單請(qǐng)求

????????另外如下圖所示:(Access-Control-Allow-Methods:首部字段用于預(yù)檢請(qǐng)求的響應(yīng)。其指明了實(shí)際請(qǐng)求所允許使用的 HTTP 方法毫别。)所以說娃弓,這個(gè)接口只接受get請(qǐng)求;

????????Access-Control-Allow-Headers表示用戶想要修改‘a(chǎn)pi_token’和‘content-type’兩個(gè)請(qǐng)求頭信息岛宦;

????????Access-Control-Expose-Headers,里面表示了用戶只允許修改一個(gè)名為‘a(chǎn)pi_token’的頭部字段耍缴。


options預(yù)請(qǐng)求

? ? ? ? 如下圖:在第二次實(shí)際請(qǐng)求當(dāng)中砾肺,用戶想要篡改content-type為json,但是未生效防嗡,請(qǐng)求出去的Request Payload竟然是get提交方式的字符串拼接变汪,說明用戶主動(dòng)修改的content-type未生效,修改這個(gè)請(qǐng)求頭沒有得到服務(wù)器認(rèn)可蚁趁。

options后的第二次實(shí)際用戶請(qǐng)求

正常json請(qǐng)求的Request Payload為:


正常情況Request Payload


? ??????倉(cāng)促成文裙盾,不當(dāng)之處,尚祈方家和讀者批評(píng)指正他嫡。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末番官,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子钢属,更是在濱河造成了極大的恐慌徘熔,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淆党,死亡現(xiàn)場(chǎng)離奇詭異酷师,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)染乌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門山孔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人荷憋,你說我怎么就攤上這事台颠。” “怎么了台谊?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵蓉媳,是天一觀的道長(zhǎng)譬挚。 經(jīng)常有香客問我,道長(zhǎng)酪呻,這世上最難降的妖魔是什么减宣? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮玩荠,結(jié)果婚禮上漆腌,老公的妹妹穿的比我還像新娘。我一直安慰自己阶冈,他們只是感情好闷尿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著女坑,像睡著了一般填具。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上匆骗,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天劳景,我揣著相機(jī)與錄音,去河邊找鬼碉就。 笑死盟广,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瓮钥。 我是一名探鬼主播筋量,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼碉熄!你這毒婦竟也來了桨武?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤具被,失蹤者是張志新(化名)和其女友劉穎玻募,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體一姿,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡七咧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叮叹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艾栋。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蛉顽,靈堂內(nèi)的尸體忽然破棺而出蝗砾,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布悼粮,位于F島的核電站闲勺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏扣猫。R本人自食惡果不足惜菜循,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望申尤。 院中可真熱鬧癌幕,春花似錦、人聲如沸昧穿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽时鸵。三九已至胶逢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間寥枝,已是汗流浹背宪塔。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留囊拜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓比搭,卻偏偏與公主長(zhǎng)得像冠跷,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子身诺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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

  • 什么是跨域 跨域蜜托,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本。它是由瀏覽器的同源策略造成的霉赡,是瀏覽器對(duì)JavaScript實(shí)...
    HeroXin閱讀 836評(píng)論 0 4
  • 什么是跨域 跨域橄务,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本。它是由瀏覽器的同源策略造成的穴亏,是瀏覽器對(duì)JavaScript實(shí)...
    Yaoxue9閱讀 1,299評(píng)論 0 6
  • 什么是跨域 跨域蜂挪,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本。它是由瀏覽器的同源策略造成的嗓化,是瀏覽器對(duì)JavaScript實(shí)...
    他方l閱讀 1,064評(píng)論 0 2
  • 1. 什么是跨域 跨域棠涮,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本。它是由瀏覽器的同源策略造成的刺覆,是瀏覽器對(duì)JavaScri...
    cbw100閱讀 6,332評(píng)論 2 86
  • CORS是一個(gè)W3C標(biāo)準(zhǔn)严肪,全稱是"跨域資源共享"(Cross-origin resource sharing)。 ...
    奇特思維家閱讀 1,121評(píng)論 0 3