java后端處理跨域

????工作中粥鞋,與前端聯(lián)調(diào)時經(jīng)常會碰到跨域問題。指的是瀏覽器不能執(zhí)行其他網(wǎng)站的腳本裕膀。它是由瀏覽器的同源策略造成的员串,是瀏覽器施加的安全限制。所以與客戶端交互的時候就不會碰到這個問題昼扛〈缙耄跨域問題,有多種解決方式抄谐,比如說前端進行代理渺鹦,本文主要結合自己的實際開發(fā),從服務器端的角度解決這個問題的蛹含。

????對于非簡單請求(具體可以這篇文章毅厚,跨域資源共享),在正式訪問請求前浦箱,瀏覽器會發(fā)送一個預檢請求吸耿,就是option請求祠锣。針對option請求,必須保證如下2點咽安,后面的正式請求才會訪問:第一伴网,要能返回Access-Control-Allow-Origin 等字段,告訴瀏覽器你這個請求域名我服務端是可以支持的妆棒。第二澡腾,對于跨域的預檢請求,要能返回成功糕珊。

ht我們一般使用servlet來處理http請求动分,開發(fā)中一般是子類繼承httpservlet。option請求會到httpservlet的doOptions(HttpServletRequest req, HttpServletResponse resp)方法進行處理放接。? ? ?

httpservlet的doOption()方法

我們可以看到httpservlet的默認doOptions方法中刺啦,請求頭中只加了一個"Allow",不滿足我們說的第一個條件,option請求過不去纠脾,后面的請求也無法訪問玛瘸。所以我們要么子類重寫doOptions方法,在方法里面解決苟蹈,要么在進入這個方法前就解決跨域問題糊渊。接下來我會講述2種不同的方式來解決這個問題。



1.基于java體系過濾器處理

我們可以使用過濾器fiter,http請求會在到達servlet的service(ServletRequest req, ServletResponse res)方法前被攔截慧脱。我們可以在doFilter方法中進行處理渺绒。

fiter處理跨域示例

注意:option請求,不會攜帶參數(shù)菱鸥,和cookie信息宗兼,一般直接攔截掉,不進入后面的邏輯處理氮采。 這種方式基于java本身體系殷绍,容易理解,也很方便鹊漠,推薦使用這種模式主到。



2.基于spring體系的攔截器處理

在項目中,我們一般使用springmvc躯概,可以使用攔截器Interceptor來處理跨域問題登钥。? ? ? ? ? ? ? ? ? ? springmvc只要靠DispatcherServlet這個類來處理http請求的。


DispaterServlet的doOptions方法

請求進到DispaterServlet的doOptions方法中娶靡,然后調(diào)用processRequest(request, response)方法處理請求邏輯牧牢,調(diào)用鏈比較長,最終會進入到doDispatcher方法。


DispaterServlet#doDispath()方法

這個方法處理邏輯也比較復雜结执,我們主要關注幾點度陆,找到請求對應的HandlerExecutionChain,這個mappedHandler包括對應的處理器和interceptor集合献幔,然后找到對應的適配器,然后執(zhí)行攔截器的prehandle()方法趾诗,我們需要在攔截器的prehandle()處理下跨域即可蜡感。


攔截器處理跨域示例

同樣針對跨域請求,需要攔截掉恃泪,因為option不帶參數(shù)郑兴,會對后面的業(yè)務邏輯有影像。

這種基于spring體系的攔截器處理跨域問題贝乎,需要對spring的源碼有一定的理解情连,不然會出現(xiàn)問題,下面講一下用這種方法踩過的坑览效。

1.之前有一個項目却舀,我用攔截器這種方式怎么都不能解決跨域問題,百思不得其解锤灿,有的項目可以挽拔,有的項目用攔截器就不行,遂用過濾器的方法解決但校。后面閱讀了一下源碼才發(fā)現(xiàn)是spring的版本問題導致的螃诅。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 那個項目的spring是3.8版本的,之前的doOption()方法長這樣状囱。


3.8的版本doOptions()方法

我們可以看到术裸,只有this.dispatchOptionsRequest為true的時候,才會進入到processRequest(request, response)方法亭枷,后面進行攔截器處理袭艺。但是this.dispatchOptionsReques默認為false,如果你不配置的話奶栖,后面的攔截器永遠不會執(zhí)行匹表。會進入父類的doOptions()方法,前面講過宣鄙,原始的doOptions()方法無法處理跨域問題袍镀。如果要使用的話,需要到web.xml文件中配置一下


DispatcherServlet配置

spring4.0的版本后面優(yōu)化這段邏輯冻晤,可以看下上面的那個截圖苇羡,是基于spring4.2的,默認option請求鼻弧,直接進入后面的邏輯设江。

2.前面講過锦茁,doDisPatch()方法會去找對應的handler和攔截器,一般是通過requestmapping來查找叉存,默認是根據(jù)url來查找


示例

這種情況下码俩,會根據(jù)url,method聯(lián)合查找處理器,因為我們這個請求是option請求歼捏,會報一個405異常稿存,后面的請求會攔截掉了。解決辦法瞳秽,要么去掉method瓣履,在實際開發(fā)中,這個個人感覺沒多大用练俐,或者在method后面加一個OPTIONS袖迎。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市腺晾,隨后出現(xiàn)的幾起案子燕锥,更是在濱河造成了極大的恐慌,老刑警劉巖丘喻,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脯宿,死亡現(xiàn)場離奇詭異,居然都是意外死亡泉粉,警方通過查閱死者的電腦和手機连霉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嗡靡,“玉大人跺撼,你說我怎么就攤上這事√直耍” “怎么了歉井?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長哈误。 經(jīng)常有香客問我哩至,道長,這世上最難降的妖魔是什么蜜自? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任菩貌,我火速辦了婚禮,結果婚禮上重荠,老公的妹妹穿的比我還像新娘箭阶。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布仇参。 她就那樣靜靜地躺著嘹叫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪诈乒。 梳的紋絲不亂的頭發(fā)上罩扇,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音抓谴,去河邊找鬼暮蹂。 笑死,一個胖子當著我的面吹牛癌压,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播荆陆,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼滩届,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了被啼?” 一聲冷哼從身側響起帜消,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浓体,沒想到半個月后泡挺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡命浴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年娄猫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片生闲。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡媳溺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出碍讯,到底是詐尸還是另有隱情悬蔽,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布捉兴,位于F島的核電站蝎困,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏倍啥。R本人自食惡果不足惜禾乘,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逗栽。 院中可真熱鬧盖袭,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拙已,卻和暖如春决记,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背倍踪。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工系宫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人建车。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓扩借,卻偏偏與公主長得像,于是被迫代替她去往敵國和親缤至。 傳聞我的和親對象是個殘疾皇子潮罪,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

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

  • 前端如何使用proxyTable和nginx解決跨域問題 前言 前后端數(shù)據(jù)交互經(jīng)常會碰到請求跨域,什么是跨域领斥,以及...
    kangaroo_v閱讀 1,237評論 0 33
  • 前言 前后端數(shù)據(jù)交互經(jīng)常會碰到請求跨域嫉到,什么是跨域,以及有哪幾種跨域方式月洛,這是本文要探討的內(nèi)容何恶。 本文完整的源代碼...
    浪里行舟閱讀 2,935評論 0 32
  • IOC 控制反轉容器控制程序對象之間的關系,而不是傳統(tǒng)實現(xiàn)中嚼黔,有程序代碼之間控制细层,又名依賴注入。All 類的創(chuàng)建隔崎,...
    irckwk1閱讀 942評論 0 0
  • 這部分主要是與Java Web和Web Service相關的面試題今艺。 96、闡述Servlet和CGI的區(qū)別? 答...
    雜貨鋪老板閱讀 1,404評論 0 10
  • 楠天下的太陽花/文 今日健身記錄如下: 記錄目標: 每日一練爵卒,養(yǎng)成習慣虚缎。 基本記錄:五項 1,健身項目:瑜伽之門閂...
    楠天下的太陽花閱讀 1,106評論 8 16