ajax跨域

受瀏覽器的同源策略限制公壤,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é)商俘闯。

注意:現(xiàn)代手機(jī)瀏覽器都支持跨域潭苞,跨域訪問不拒絕大都是pc瀏覽器造成!

  1. 簡單跨域請求真朗。當(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)。
  2. 帶預(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é)商:1. Origin旧烧。HTTP請求頭,任何涉及CORS的請求都必需攜帶画髓。2. Access-Control-Request-Method掘剪。HTTP請求頭,在帶預(yù)檢(Preflighted)的跨域請求中用來表示真實請求的方法奈虾。3. Access-Control-Request-Headers夺谁。HTTP請求頭,在帶預(yù)檢(Preflighted)的跨域請求中用來表示真實請求的自定義Header列表肉微。4. Access-Control-Allow-Origin匾鸥。HTTP響應(yīng)頭,指定服務(wù)器端允許進(jìn)行跨域資源訪問的來源域碉纳∥鸶海可以用通配符*表示允許任何域的JavaScript訪問資源,但是在響應(yīng)一個攜帶身份信息(Credential)的HTTP請求時劳曹,Access-Control-Allow-Origin必需指定具體的域奴愉,不能用通配符。5. Access-Control-Allow-Methods厚者。HTTP響應(yīng)頭躁劣,指定服務(wù)器允許進(jìn)行跨域資源訪問的請求方法列表,一般用在響應(yīng)預(yù)檢請求上库菲。6. Access-Control-Allow-Headers。HTTP響應(yīng)頭志膀,指定服務(wù)器允許進(jìn)行跨域資源訪問的請求頭列表熙宇,一般用在響應(yīng)預(yù)檢請求上。7. Access-Control-Max-Age溉浙。HTTP響應(yīng)頭烫止,用在響應(yīng)預(yù)檢請求上,表示本次預(yù)檢響應(yīng)的有效時間戳稽。在此時間內(nèi)馆蠕,瀏覽器都可以根據(jù)此次協(xié)商結(jié)果決定是否有必要直接發(fā)送真實請求期升,而無需再次發(fā)送預(yù)檢請求。
  3. 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ù)端。
header('Access-Control-Allow-Origin:*');  //支持全域名訪問寄雀,不安全得滤,部署后需要固定限制為客戶端網(wǎng)址
header('Access-Control-Allow-Methods:POST,GET,OPTIONS,DELETE'); //支持的http 動作
header('Access-Control-Allow-Headers:x-requested-with,content-type');  //響應(yīng)頭 請按照自己需求添加。
$.ajax({  
       url: "http://test.com",  
       dataType: 'json',  
       type: 'GET',  
       beforeSend: function (xhr) {  
           xhr.setRequestHeader("Test", "testheadervalue");  
       },  
       async: false,  
       cache: false,  
       //contentType: 'application/x-www-form-urlencoded',  
       success: function (sResponse) {  
       }  
   });  

如果是get請求盒犹,datatype也可以直接是jsonp懂更,如果是post請求,請在服務(wù)端設(shè)置header阿趁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末膜蛔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子脖阵,更是在濱河造成了極大的恐慌皂股,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件命黔,死亡現(xiàn)場離奇詭異呜呐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)悍募,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門蘑辑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人坠宴,你說我怎么就攤上這事洋魂。” “怎么了喜鼓?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵副砍,是天一觀的道長。 經(jīng)常有香客問我庄岖,道長豁翎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任隅忿,我火速辦了婚禮心剥,結(jié)果婚禮上邦尊,老公的妹妹穿的比我還像新娘。我一直安慰自己优烧,他們只是感情好蝉揍,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著匙隔,像睡著了一般疑苫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纷责,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天捍掺,我揣著相機(jī)與錄音,去河邊找鬼再膳。 笑死挺勿,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的喂柒。 我是一名探鬼主播不瓶,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼灾杰!你這毒婦竟也來了蚊丐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤艳吠,失蹤者是張志新(化名)和其女友劉穎麦备,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昭娩,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡凛篙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了栏渺。 大學(xué)時的朋友給我發(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
  • 我被黑心中介騙來泰國打工系馆, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留送漠,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓由蘑,卻偏偏與公主長得像闽寡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子尼酿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

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