跨域問題剖析 && SpringMVC跨域解決方案

Part1:跨域問題剖析

1.跨域問題出現(xiàn)的原因

跨域問題:一般是A瀏覽器請求了非同源牵寺,例如B服務(wù)器的URI時钉汗,所導(dǎo)致的問題。

2.瀏覽器為什么要限制同源闷尿?

同源目的:是為了保證用戶信息的安全葫慎,防止惡意的網(wǎng)站竊取數(shù)據(jù)衔彻。eg:比如銀行用戶的cookie信息。

3.同源的3個指標(biāo)

所謂"同源"指的是"三個相同"偷办。
1>協(xié)議相同
2>域名相同
3>端口相同

4.非同源受限制的3個行為

1>Cookie米奸、LocalStorage 和 IndexDB 無法讀取。

2>DOM 無法獲得爽篷。

3>AJAX 請求不能發(fā)送悴晰。

其中第3條開發(fā)時碰到的最多。

5.解決非同源AJAX請求報錯

同源政策規(guī)定逐工,AJAX請求只能發(fā)給同源的網(wǎng)址铡溪,否則就報錯。

除了架設(shè)服務(wù)器代理(瀏覽器請求同源服務(wù)器泪喊,再由后者請求外部服務(wù))棕硫,有三種方法規(guī)避這個限制。

1>JSONP
2>WebSocket
3>CORS

Part2:SpringMVC通過CORS協(xié)議解決跨域問題

1.CORS介紹

CORS是一個W3C標(biāo)準(zhǔn)袒啼,全稱是"跨域資源共享"(Cross-origin resource sharing)哈扮。

它允許瀏覽器向跨源服務(wù)器,發(fā)出XMLHttpRequest請求蚓再,從而克服了AJAX只能同源使用的限制滑肉。

CORS需要瀏覽器和服務(wù)器同時支持。目前摘仅,所有瀏覽器都支持該功能靶庙,IE瀏覽器不能低于IE10。

整個CORS通信過程娃属,都是瀏覽器自動完成六荒,不需要用戶參與护姆。對于開發(fā)者來說,CORS通信與同源的AJAX通信沒有差別掏击,代碼完全一樣卵皂。瀏覽器一旦發(fā)現(xiàn)AJAX請求跨源,就會自動添加一些附加的頭信息砚亭,有時還會多出一次附加的請求灯变,但用戶不會有感覺。

因此钠惩,實現(xiàn)CORS通信的關(guān)鍵是服務(wù)器柒凉。只要服務(wù)器實現(xiàn)了CORS接口族阅,就可以跨源通信篓跛。

2.方法1:Spring-自定義Fliter:在response中添加CORS響應(yīng)頭(Access-Control-Allow*)

3.方法2:SpringMVC4提供了非常方便的實現(xiàn)跨域的方法。在requestMapping中使用注解坦刀。

@CrossOrigin(origins = “http://kbiao.me”)

Part3:自己實際測試

1.跨域情境模擬:

前端index.html在電腦A上愧沟,頁面中有個submit按鈕來發(fā)送ajax請求。且請求url定位到后臺對應(yīng)Handler:http://192.168.0.218:8080/InsureService/crossOrigin/detail鲤遥;

后臺服務(wù)器在電腦B上沐寺,Spring項目中書寫一個測試controller接收HTTP請求。代碼如下:

@Controller
@RequestMapping("/crossOrigin")
public class CrossOriginController {


    @RequestMapping(value = "/detail", method = RequestMethod.POST)
    @ResponseBody
    public String savePayAndTrip(HttpServletRequest request){

        String reqStr = HttpUtils.getReqeustData(request);

        System.out.println("請求報文:" + reqStr);

        return reqStr;
    }//end method

}

2.跨域問題重現(xiàn):

在上述情境準(zhǔn)備下盖奈,前端請求的Origin為null混坞,后端Origin為http://192.168.0.218:8080。兩者不同源钢坦,所以前端的ajax請求究孕,無法到達(dá)后臺的Handler,也就不能被處理爹凹。(前端源為null厨诸,因為在本地電腦A直接在瀏覽器加載html文件發(fā)起請求導(dǎo)致。)

谷歌瀏覽器測試禾酱,截圖:
1.跨域錯誤前端信息

2.跨域問題錯誤細(xì)節(jié)

3.跨域問題解決:使用Spring的@CrossOrigin注解

@CrossOrigin注解微酬,可以放在Controller類上,允許Controller中所有方法可被某個跨域請求颤陶;也可以放在Controller類中某一個方法上颗管,指明當(dāng)前方法可以被哪些跨域請求

示例代碼中:將@CrossOrigin加在Controller類上:

@Controller
@RequestMapping("/crossOrigin")
@CrossOrigin(origins = "*")   //跨域核心配置
public class CrossOriginController {


    @RequestMapping(value = "/detail", method = RequestMethod.POST)
    @ResponseBody
    public String savePayAndTrip(HttpServletRequest request){

        String reqStr = HttpUtils.getReqeustData(request);

        System.out.println("請求報文:" + reqStr);

        return reqStr;
    }//end method

}
分析:

瀏覽器針對'非簡單請求'的跨域滓走,會根據(jù)CORS協(xié)議在底層會發(fā)起兩次request:
(1)使用HTTP協(xié)議OPTIONS方法忙上,發(fā)起的預(yù)檢請求(preflight request);
(2)發(fā)起正常請求

谷歌瀏覽器測試結(jié)果:
1.OPTIONS預(yù)檢請求
2.正常請求

參考文章(干貨滿滿)

1.阮一峰---瀏覽器同源政策及其規(guī)避方法
2.阮一峰---跨域資源共享 CORS 詳解
3.Spring MVC通過CROS協(xié)議解決跨域問題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市闲坎,隨后出現(xiàn)的幾起案子疫粥,更是在濱河造成了極大的恐慌茬斧,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梗逮,死亡現(xiàn)場離奇詭異项秉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)慷彤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門娄蔼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人底哗,你說我怎么就攤上這事岁诉。” “怎么了跋选?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵涕癣,是天一觀的道長。 經(jīng)常有香客問我前标,道長坠韩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任炼列,我火速辦了婚禮只搁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘俭尖。我一直安慰自己氢惋,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布稽犁。 她就那樣靜靜地躺著焰望,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缭付。 梳的紋絲不亂的頭發(fā)上柿估,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機(jī)與錄音陷猫,去河邊找鬼秫舌。 笑死,一個胖子當(dāng)著我的面吹牛绣檬,可吹牛的內(nèi)容都是我干的足陨。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼娇未,長吁一口氣:“原來是場噩夢啊……” “哼墨缘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤镊讼,失蹤者是張志新(化名)和其女友劉穎宽涌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝶棋,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡卸亮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了玩裙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兼贸。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吃溅,靈堂內(nèi)的尸體忽然破棺而出溶诞,到底是詐尸還是另有隱情,我是刑警寧澤决侈,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布螺垢,位于F島的核電站,受9級特大地震影響颜及,放射性物質(zhì)發(fā)生泄漏甩苛。R本人自食惡果不足惜蹂楣,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一俏站、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧痊土,春花似錦肄扎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至酌呆,卻和暖如春衡载,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背隙袁。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工痰娱, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人菩收。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓梨睁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親娜饵。 傳聞我的和親對象是個殘疾皇子坡贺,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

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

  • 1. 什么是跨域 跨域,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本。它是由瀏覽器的同源策略造成的遍坟,是瀏覽器對JavaScri...
    cbw100閱讀 6,315評論 2 86
  • <轉(zhuǎn)>詳解跨域(最全的解決方案) 什么是跨域跨域拳亿,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本。它是由瀏覽器的同源策略造成的愿伴,...
    涅槃快樂是金閱讀 4,721評論 0 3
  • 題目1.什么是同源策略? 同源策略(Same origin Policy): 瀏覽器出于安全方面的考慮风瘦,只允許與本...
    FLYSASA閱讀 1,715評論 0 6
  • 當(dāng)我們以就業(yè)為導(dǎo)向,為考生填報高考志愿的時候公般,研究每年的我國高校畢業(yè)生的薪酬排行就成了我們的日常工作之一万搔,那么這個...
  • 《給我顆糖好嗎》 夜晚的風(fēng)很大 城市里哪有家 孤獨的人不會說話 詩人的浪漫在寂靜里掙扎 我早把煙戒啦 你給我顆糖好...
    阿唐學(xué)姐閱讀 547評論 0 9