利用跨域資源共享CORS解決跨域問題

最近在琢磨前后端分離,難免會碰到跨域問題裁替。

首先弄清楚项玛,跨域指的是瀏覽器不能執(zhí)行其他網(wǎng)站的腳本。它是由瀏覽器的同源策略造成的弱判,是瀏覽器施加的安全限制襟沮。

何為同源?

URL由協(xié)議昌腰、域名开伏、端口和路徑組成,如果兩個URL的協(xié)議剥哑、域名和端口相同硅则,則表示他們同源。

同源策略(是瀏覽器實施的)

瀏覽器的同源策略株婴,限制了來自不同源的"document"或腳本對當前"document"讀取或設(shè)置某些屬性 —— 從一個域上加載的腳本不允許訪問另外一個域的文檔屬性怎虫。
在瀏覽器中暑认,<script>、<img>大审、<iframe>蘸际、<link>等標簽都可以加載跨域資源,而不受同源限制徒扶,但瀏覽器限制了JavaScript的權(quán)限使其不能讀粮彤、寫加載的內(nèi)容。
另外同源策略只對網(wǎng)頁的HTML文檔做了限制姜骡,對加載的其他靜態(tài)資源如javascript导坟、css、圖片等仍然認為屬于同源圈澈。

解決方案

對于跨域常見的解決方案一般會想到以下幾種方案

  • 使用jsonp惫周。
  • 修改document.domain跨子域
  • iframe
  • 反向代理

若想要詳細了解以上解決方案,自行百度康栈,本文主要介紹使用跨域資源共享CORS來解決跨域問題

首先CORS需要瀏覽器和服務器同時支持递递。
瀏覽器直接發(fā)出CORS請求。在頭信息之中啥么,增加一個Origin字段登舞。Origin字段用來說明,本次請求來自哪個源悬荣。服務器根據(jù)這個值菠秒,決定是否同意這次請求。
服務器返回一個正常的http回應氯迂。瀏覽器查看回應的頭信息沒有包含Access-Control-Allow-Origin字段稽煤,檢查自己是否所處其中。若不在其中囚戚,拋出一個錯誤,被XMLHttpRequest的onerror回調(diào)函數(shù)捕獲轧简。若在其中驰坊,則CORS請求成功。

注意:Access-Control-Allow-Origin字段是html5新增的一項標準功能哮独,因此 IE10以下版本的瀏覽器是不支持的拳芙,因此,如果要求兼容IE9或更低版本的ie瀏覽器皮璧,會導致使用此種方式的跨域請求以及傳遞Cookie的計劃夭折

origin.png

預檢請求

瀏覽器將CORS請求分為兩類: 簡單請求非簡單請求舟扎。

非簡單請求是那種對服務器有特殊要求的請求,比如請求方法是PUT或DELETE悴务,或者Content-Type字段的類型是application/json睹限。
例如譬猫,下面的前端代碼向后臺發(fā)送了一個非簡單請求,因為它制定了'Content-type': 'application/json'


code.png

非簡單請求的CORS請求羡疗,會在正式通信之前染服,增加一次HTTP查詢請求,稱為"預檢"請求叨恨。

預檢請求的請求方法是OPTIONS,請求的頭信息包括兩個特殊字段:

  • Access-Control-Request-Method
    該字段是必須的柳刮,用來列出瀏覽器的CORS請求會用到哪些HTTP方法。
  • Access-Control-Request-Headers
    該字段是一個逗號分隔的字符串痒钝,指定瀏覽器CORS請求會額外發(fā)送的頭信息字段秉颗。

服務器回應的其他CORS相關(guān)字段:

  • Access-Control-Allow-Methods
    該字段必需,它的值是逗號分隔的一個字符串送矩,表明服務器支持的所有跨域請求的方法蚕甥。注意,返回的是所有支持的方法益愈,而不單是瀏覽器請求的那個方法梢灭。這是為了避免多次"預檢"請求。
  • Access-Control-Allow-Headers
    如果瀏覽器請求包括Access-Control-Request-Headers字段蒸其,則Access-Control-Allow-Headers字段是必需的敏释。它也是一個逗號分隔的字符串,表明服務器支持的所有頭信息字段摸袁,不限于瀏覽器在"預檢"中請求的字段钥顽。
  • Access-Control-Max-Age
    該字段可選,用來指定本次預檢請求的有效期靠汁,單位為秒蜂大。在此期間,不用發(fā)出另一條預檢請求蝶怔。


    AccessControl.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奶浦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子踢星,更是在濱河造成了極大的恐慌澳叉,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沐悦,死亡現(xiàn)場離奇詭異成洗,居然都是意外死亡,警方通過查閱死者的電腦和手機藏否,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門瓶殃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人副签,你說我怎么就攤上這事遥椿』” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵修壕,是天一觀的道長愈捅。 經(jīng)常有香客問我,道長慈鸠,這世上最難降的妖魔是什么蓝谨? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮青团,結(jié)果婚禮上譬巫,老公的妹妹穿的比我還像新娘。我一直安慰自己督笆,他們只是感情好芦昔,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著娃肿,像睡著了一般咕缎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上料扰,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天凭豪,我揣著相機與錄音,去河邊找鬼晒杈。 笑死嫂伞,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的拯钻。 我是一名探鬼主播帖努,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼粪般!你這毒婦竟也來了拼余?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤亩歹,失蹤者是張志新(化名)和其女友劉穎姿搜,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捆憎,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年梭纹,在試婚紗的時候發(fā)現(xiàn)自己被綠了躲惰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡变抽,死狀恐怖础拨,靈堂內(nèi)的尸體忽然破棺而出氮块,到底是詐尸還是另有隱情,我是刑警寧澤诡宗,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布滔蝉,位于F島的核電站,受9級特大地震影響塔沃,放射性物質(zhì)發(fā)生泄漏蝠引。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一蛀柴、第九天 我趴在偏房一處隱蔽的房頂上張望螃概。 院中可真熱鬧,春花似錦鸽疾、人聲如沸吊洼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冒窍。三九已至,卻和暖如春豺鼻,著一層夾襖步出監(jiān)牢的瞬間综液,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工拘领, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留意乓,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓约素,卻偏偏與公主長得像届良,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子圣猎,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

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