HTTP訪問控制(CORS)

在Web開發(fā)中衬衬,經常會碰到跨站請求夜矗。比如A域名下的站點http://domainA通過AJAX請求B域名下的站點http://domainB的資源(比如圖片妆偏,javascript腳本或其它類資源)我磁。

出于安全考慮圃阳,瀏覽器會限制腳本中發(fā)起的跨站請求伞租。比如,使用XMLHttpRequest對象發(fā)起的HTTP請求就必須遵循同源策略限佩。即Web應用程序只能使用XMLHttpRequest對象向其加載的源域名發(fā)起HTTP請求葵诈,而不能向任何其它域名發(fā)起請求。

跨源資源共享(Cross-Orgin Resource Sharing(CORS))機制讓Web應用服務器能支持跨站訪問祟同,從而使得安全的進行跨站數(shù)據(jù)傳輸成為可能作喘。
CORS在以下場景可以使用跨站HTTP請求:
1,XMLHttpRequest發(fā)起的跨站HTTP請求
2晕城,Web字體
3泞坦,WebGL貼圖
4,使用drawImage API在canvas上畫圖

簡單請求

所謂的簡單砖顷,是指:
1贰锁,只使用 GET, HEAD 或者 POST 請求方法。如果使用 POST 向服務器端傳送數(shù)據(jù)滤蝠,則數(shù)據(jù)類型(Content-Type)只能是 application/x-www-form-urlencoded, multipart/form-data 或 text/plain中的一種豌熄。
2,不會使用自定義請求頭(類似于 X-Modified 這種)物咳。

var invocation = new XMLHttpRequest();
var url = 'http://bar.other/resources/public-data/';
   
function callOtherDomain() {
  if(invocation) {    
    invocation.open('GET', url, true);
    invocation.onreadystatechange = handler;
    invocation.send(); 
  }
}

預請求

不同于上面討論的簡單請求锣险,“預請求”要求必須先發(fā)送一個 OPTIONS 請求給目的站點,來查明這個跨站請求對于目的站點是不是安全可接受的览闰。這樣做芯肤,是因為跨站請求可能會對目的站點的數(shù)據(jù)造成破壞。 當請求具備以下條件压鉴,就會被當成預請求處理:

1, 請求以 GET, HEAD 或者 POST 以外的方法發(fā)起請求崖咨。或者油吭,使用 POST击蹲,但請求數(shù)據(jù)為 application/x-www-form-urlencoded, multipart/form-data 或者 text/plain 以外的數(shù)據(jù)類型。比如說上鞠,用 POST 發(fā)送數(shù)據(jù)類型為 application/xml 或者 text/xml 的 XML 數(shù)據(jù)的請求际邻。
2, 使用自定義請求頭(比如添加諸如 X-PINGOTHER)

var invocation = new XMLHttpRequest();
var url = 'http://bar.other/resources/post-here/';
var body = '{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}Arun';
    
function callOtherDomain(){
  if(invocation)
    {
      invocation.open('POST', url, true);
      invocation.setRequestHeader('X-PINGOTHER', 'pingpong');
      invocation.setRequestHeader('Content-Type', 'application/xml');
      invocation.onreadystatechange = handler;
      invocation.send(body); 
    }

......

服務器與瀏覽器之間具體的交互過程:
使用一個 OPTIONS 發(fā)送了一個“預請求”芯丧,來探明服務器端是否接受后續(xù)真正的請求芍阎。

OPTIONS /resources/post-here/ HTTP/1.1
Host: bar.other
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3pre
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Origin: http://foo.example
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-PINGOTHER


HTTP/1.1 200 OK
Date: Mon, 01 Dec 2008 01:15:39 GMT
Server: Apache/2.0.61 (Unix)
Access-Control-Allow-Origin: http://foo.example
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-PINGOTHER
Access-Control-Max-Age: 1728000
Vary: Accept-Encoding, Origin
Content-Encoding: gzip
Content-Length: 0
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Content-Type: text/plain

POST /resources/post-here/ HTTP/1.1
Host: bar.other
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3pre
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
X-PINGOTHER: pingpong
Content-Type: text/xml; charset=UTF-8
Referer: http://foo.example/examples/preflightInvocation.html
Content-Length: 55
Origin: http://foo.example
Pragma: no-cache
Cache-Control: no-cache

Arun


HTTP/1.1 200 OK
Date: Mon, 01 Dec 2008 01:15:40 GMT
Server: Apache/2.0.61 (Unix)
Access-Control-Allow-Origin: http://foo.example
Vary: Accept-Encoding, Origin
Content-Encoding: gzip
Content-Length: 235
Keep-Alive: timeout=2, max=99
Connection: Keep-Alive
Content-Type: text/plain

[Some GZIP'd payload]

隨同 OPTIONS 請求,以下兩個請求頭一起被發(fā)送:

Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-PINGOTHER

請求頭Access-Control-Request-Method可以提醒服務器跨站請求將使用POST方法缨恒,而請求頭Access-Control-Request-Headers則告知服務器該跨站請求將攜帶一個自定義請求頭X-PINGOTHER谴咸。這樣轮听,服務器就可以決定,在當前情況下岭佳,是否接受該跨站請求訪問血巍。

Access-Control-Allow-Origin: http://foo.example
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-PINGOTHER
Access-Control-Max-Age: 1728000

響應頭Access-Control-Allow-Methods表明服務器可以接受POST, GET和 OPTIONS的請求方法。響應頭Access-Control-Allow-Headers則表示服務器接受自定義請求頭X-PINGOTHER珊随。最后述寡,響應頭Access-Control-Max-Age告訴瀏覽器,本次“預請求”的響應結果有效時間是多久叶洞。在上面的例子里鲫凶,1728000秒代表著20天內,瀏覽器在處理針對該服務器的跨站請求衩辟,都可以無需再發(fā)送“預請求”螟炫,只需根據(jù)本次結果進行判斷處理。

參考:HTTP訪問控制(CORS)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末艺晴,一起剝皮案震驚了整個濱河市昼钻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌封寞,老刑警劉巖然评,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異狈究,居然都是意外死亡沾瓦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門谦炒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贯莺,“玉大人,你說我怎么就攤上這事宁改÷铺剑” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵还蹲,是天一觀的道長爹耗。 經常有香客問我,道長谜喊,這世上最難降的妖魔是什么潭兽? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮斗遏,結果婚禮上山卦,老公的妹妹穿的比我還像新娘。我一直安慰自己诵次,他們只是感情好账蓉,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布枚碗。 她就那樣靜靜地躺著,像睡著了一般铸本。 火紅的嫁衣襯著肌膚如雪肮雨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天箱玷,我揣著相機與錄音怨规,去河邊找鬼。 笑死锡足,一個胖子當著我的面吹牛椅亚,可吹牛的內容都是我干的。 我是一名探鬼主播舱污,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼呀舔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扩灯?” 一聲冷哼從身側響起媚赖,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎珠插,沒想到半個月后惧磺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡捻撑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年磨隘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顾患。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡番捂,死狀恐怖,靈堂內的尸體忽然破棺而出江解,到底是詐尸還是另有隱情设预,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布犁河,位于F島的核電站鳖枕,受9級特大地震影響,放射性物質發(fā)生泄漏桨螺。R本人自食惡果不足惜宾符,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望灭翔。 院中可真熱鬧魏烫,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狭园。三九已至读处,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唱矛,已是汗流浹背罚舱。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绎谦,地道東北人管闷。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像窃肠,于是被迫代替她去往敵國和親包个。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容

  • 引用自HTTP訪問控制(CORS) 當 Web 資源請求由其它域名或端口提供的資源時冤留,會發(fā)起跨域 HTTP 請求(...
    有涯逐無涯閱讀 2,570評論 0 4
  • HTTP訪問控制(CORS) 要點摘錄: 跨域資源共享(CORS)機制允許Web 應用服務器進行跨域訪問控制碧囊,從...
    谷子多閱讀 286評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)纤怒,斷路器糯而,智...
    卡卡羅2017閱讀 134,601評論 18 139
  • 什么是CORS? CORS(Cross-Origin Resource Sharing ) 全稱“跨域資源共享”泊窘,...
    singno閱讀 766評論 0 0
  • 高考熄驼,似乎就是一條人生的分界線。 高考之前烘豹,每天只有一個目標:一定要考上理想的大學瓜贾。每天只朝著一個...
    無吝閱讀 180評論 0 0