簡單跨域請求和帶預(yù)檢的跨域請求(轉(zhuǎn))

轉(zhuǎn)載鏈接:https://www.cnblogs.com/raind/p/10771778.html

受瀏覽器的同源策略限制,JavaSript只能請求本域內(nèi)的資源若债。跨域資源共享(Cross-Origin Resource Sharing, CORS)是為解決Ajax技術(shù)難實現(xiàn)跨域問題而提出的一個規(guī)范琉闪,這個規(guī)范試著從根本上解決安全的跨域資源共享問題段审。在此之前,解決此類問題的途徑往往是服務(wù)器代理、JSONP等篓叶,治標(biāo)不治本。目前基本所有瀏覽器都已經(jīng)支持該規(guī)范羞秤。

一個域是由schema缸托、host、port三者共同組成瘾蛋,與路徑無關(guān)俐镐。所謂跨域,是指在http://example-foo.com/域上通過XMLHttpRequest對象調(diào)用http://example-bar.com/域上的資源哺哼。CORS約定服務(wù)器端和瀏覽器在HTTP協(xié)議之上佩抹,通過一些額外HTTP頭部信息,進(jìn)行跨域資源共享的協(xié)商取董。服務(wù)器端和瀏覽器都必需遵循規(guī)范中的要求棍苹。

CORS把HTTP請求分成兩類,不同類別按不同的策略進(jìn)行跨域資源共享協(xié)商茵汰。

簡單跨域請求枢里。
當(dāng)HTTP請求出現(xiàn)以下兩種情況時,瀏覽器認(rèn)為是簡單跨域請求:
1). 請求方法是GET蹂午、HEAD或者POST栏豺,并且當(dāng)請求方法是POST時,Content-Type必須是application/x-www-form-urlencoded, multipart/form-data或者text/plain中的一個值豆胸。
2). 請求中沒有自定義HTTP頭部奥洼。

對于簡單跨域請求,瀏覽器要做的就是在HTTP請求中添加Origin Header配乱,將JavaScript腳本所在域填充進(jìn)去溉卓,向其他域的服務(wù)器請求資源。服務(wù)器端收到一個簡單跨域請求后搬泥,根據(jù)資源權(quán)限配置桑寨,在響應(yīng)頭中添加Access-Control-Allow-Origin Header。瀏覽器收到響應(yīng)后忿檩,查看Access-Control-Allow-Origin Header尉尾,如果當(dāng)前域已經(jīng)得到授權(quán),則將結(jié)果返回給JavaScript燥透。否則瀏覽器忽略此次響應(yīng)沙咏。

帶預(yù)檢(Preflighted)的跨域請求辨图。
當(dāng)HTTP請求出現(xiàn)以下兩種情況時,瀏覽器認(rèn)為是帶預(yù)檢(Preflighted)的跨域請求:
1). 除GET肢藐、HEAD和POST(only with application/x-www-form-urlencoded, multipart/form-data, text/plain Content-Type)以外的其他HTTP方法故河。
2). 請求中出現(xiàn)自定義HTTP頭部。

帶預(yù)檢(Preflighted)的跨域請求需要瀏覽器在發(fā)送真實HTTP請求之前先發(fā)送一個OPTIONS的預(yù)檢請求吆豹,檢測服務(wù)器端是否支持真實請求進(jìn)行跨域資源訪問鱼的,真實請求的信息在OPTIONS請求中通過Access-Control-Request-Method Header和Access-Control-Request-Headers Header描述,此外與簡單跨域請求一樣痘煤,瀏覽器也會添加Origin Header凑阶。服務(wù)器端接到預(yù)檢請求后,根據(jù)資源權(quán)限配置衷快,在響應(yīng)頭中放入Access-Control-Allow-Origin Header宙橱、Access-Control-Allow-Methods和Access-Control-Allow-Headers Header,分別表示允許跨域資源請求的域蘸拔、請求方法和請求頭师郑。此外,服務(wù)器端還可以加入Access-Control-Max-Age Header都伪,允許瀏覽器在指定時間內(nèi)呕乎,無需再發(fā)送預(yù)檢請求進(jìn)行協(xié)商,直接用本次協(xié)商結(jié)果即可陨晶。瀏覽器根據(jù)OPTIONS請求返回的結(jié)果來決定是否繼續(xù)發(fā)送真實的請求進(jìn)行跨域資源訪問猬仁。這個過程對真實請求的調(diào)用者來說是透明的。

XMLHttpRequest支持通過withCredentials屬性實現(xiàn)在跨域請求攜帶身份信息(Credential先誉,例如Cookie或者HTTP認(rèn)證信息)湿刽。瀏覽器將攜帶Cookie Header的請求發(fā)送到服務(wù)器端后,如果服務(wù)器沒有響應(yīng)Access-Control-Allow-Credentials Header褐耳,那么瀏覽器會忽略掉這次響應(yīng)诈闺。

這里討論的HTTP請求是指由Ajax XMLHttpRequest對象發(fā)起的,所有的CORS HTTP請求頭都可由瀏覽器填充铃芦,無需在XMLHttpRequest對象中設(shè)置雅镊。以下是CORS協(xié)議規(guī)定的HTTP頭,用來進(jìn)行瀏覽器發(fā)起跨域資源請求時進(jìn)行協(xié)商:

Origin刃滓。HTTP請求頭仁烹,任何涉及CORS的請求都必需攜帶。

Access-Control-Request-Method咧虎。HTTP請求頭卓缰,在帶預(yù)檢(Preflighted)的跨域請求中用來表示真實請求的方法。

Access-Control-Request-Headers。HTTP請求頭征唬,在帶預(yù)檢(Preflighted)的跨域請求中用來表示真實請求的自定義Header列表捌显。

Access-Control-Allow-Origin。HTTP響應(yīng)頭总寒,指定服務(wù)器端允許進(jìn)行跨域資源訪問的來源域扶歪。可以用通配符*表示允許任何域的JavaScript訪問資源偿乖,但是在響應(yīng)一個攜帶身份信息(Credential)的HTTP請求時击罪,Access-Control-Allow-Origin必需指定具體的域哲嘲,不能用通配符贪薪。

Access-Control-Allow-Methods。HTTP響應(yīng)頭眠副,指定服務(wù)器允許進(jìn)行跨域資源訪問的請求方法列表画切,一般用在響應(yīng)預(yù)檢請求上。

Access-Control-Allow-Headers囱怕。HTTP響應(yīng)頭霍弹,指定服務(wù)器允許進(jìn)行跨域資源訪問的請求頭列表,一般用在響應(yīng)預(yù)檢請求上娃弓。

Access-Control-Max-Age典格。HTTP響應(yīng)頭,用在響應(yīng)預(yù)檢請求上台丛,表示本次預(yù)檢響應(yīng)的有效時間耍缴。在此時間內(nèi),瀏覽器都可以根據(jù)此次協(xié)商結(jié)果決定是否有必要直接發(fā)送真實請求挽霉,而無需再次發(fā)送預(yù)檢請求防嗡。

Access-Control-Allow-Credentials。HTTP響應(yīng)頭侠坎,凡是瀏覽器請求中攜帶了身份信息蚁趁,而響應(yīng)頭中沒有返回Access-Control-Allow-Credentials: true的,瀏覽器都會忽略此次響應(yīng)实胸。

總結(jié):只要是帶自定義header的跨域請求他嫡,在發(fā)送真實請求前都會先發(fā)送OPTIONS請求,瀏覽器根據(jù)OPTIONS請求返回的結(jié)果來決定是否繼續(xù)發(fā)送真實的請求進(jìn)行跨域資源訪問庐完。所以復(fù)雜請求肯定會兩次請求服務(wù)端

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钢属,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子假褪,更是在濱河造成了極大的恐慌署咽,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宁否,居然都是意外死亡窒升,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門慕匠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饱须,“玉大人,你說我怎么就攤上這事台谊∪叵保” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵锅铅,是天一觀的道長酪呻。 經(jīng)常有香客問我,道長盐须,這世上最難降的妖魔是什么玩荠? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮贼邓,結(jié)果婚禮上阶冈,老公的妹妹穿的比我還像新娘。我一直安慰自己塑径,他們只是感情好女坑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著统舀,像睡著了一般匆骗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绑咱,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天绰筛,我揣著相機(jī)與錄音,去河邊找鬼描融。 笑死铝噩,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的窿克。 我是一名探鬼主播骏庸,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼年叮!你這毒婦竟也來了具被?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤只损,失蹤者是張志新(化名)和其女友劉穎一姿,沒想到半個月后七咧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叮叹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年艾栋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛉顽。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡蝗砾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出携冤,到底是詐尸還是另有隱情悼粮,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布曾棕,位于F島的核電站扣猫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏睁蕾。R本人自食惡果不足惜苞笨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望子眶。 院中可真熱鬧,春花似錦序芦、人聲如沸臭杰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渴杆。三九已至,卻和暖如春宪塔,著一層夾襖步出監(jiān)牢的瞬間磁奖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工某筐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留比搭,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓南誊,卻偏偏與公主長得像身诺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子抄囚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355