服務(wù)端支持跨域

大背景:前后端分離后信卡,項目分開部署,域名不一致幔妨,ajax請求時需要解決跨域問題抄瓦。

服務(wù)端支持跨域方案:

1、spring早已經(jīng)支持跨域的配置陶冷。

2钙姊、@CrossOrgin注解方式,支持配置到controller或者具體的方法上埂伦。不多解釋注解的參數(shù)煞额。

說明:我理解的是,1和2方案都是通過spring提供的CorsFilter做了攔截沾谜。


3膊毁、spring 攔截器方式?

public classCrossDomainInterceptorextendsHandlerInterceptorAdapter {

@Override

???public booleanpreHandle(HttpServletRequest request,HttpServletResponse response,Object handler)throwsException {

if(RequestMethod.OPTIONS.name().equalsIgnoreCase(request.getMethod())) {

response.addHeader("Access-Control-Allow-Origin",request.getHeader("Origin"));

???????????response.addHeader("Access-Control-Allow-Methods","GET,POST,PUT,OPTIONS,DELETE");

???????????response.addHeader("Access-Control-Max-Age","1800");

???????????response.addHeader("Access-Control-Allow-Headers","Content-Type,x-requested-with,access-token");

???????????response.addHeader("Access-Control-Allow-Credentials","true");

? ? ? ? ? ? //response.setStatus(HttpStatus.SC_OK);

??????????? return false;

???????}

return true;

???}

}

4、自定義Filter基跑,然后在XML配置 filter婚温。

public classCrossDomainFilterimplementsFilter{

@Override

???public voidinit(FilterConfig filterConfig)throwsServletException {

??? }

@Override

???public voiddoFilter(ServletRequest servletRequest,ServletResponse servletResponse,FilterChain filterChain)throwsIOException,ServletException {

if(servletRequestinstanceofHttpServletRequest && servletResponseinstanceofHttpServletResponse) {

HttpServletRequest request = (HttpServletRequest) servletRequest;

???????????HttpServletResponse response = (HttpServletResponse) servletResponse;

??????????? if(CorsUtils.isCorsRequest(request)) {

log.info(request.getRequestURL().toString() +" options request into CrossDomainFilter");

??????????????? if(!processRequest(request,response) || CorsUtils.isPreFlightRequest(request)) {

return;

???????????????}

??????????? }

filterChain.doFilter(request,response);

???????}else{

filterChain.doFilter(servletRequest,servletResponse);

???????}

??? }

private booleanprocessRequest(HttpServletRequest request,HttpServletResponse response) {

booleanisValid =false;

???????String curOrigin = request.getHeader("Origin");

???????String[] domains ="http://localhost:8080,http://localhost:8090".split(",");

??????? if(domains.length>0) {

for(String domain : domains) {

if(curOrigin.equals(domain)) {

response.addHeader("Access-Control-Allow-Origin",domain);

???????????????????response.addHeader("Access-Control-Allow-Methods","GET,POST,PUT,OPTIONS,DELETE");

???????????????????response.addHeader("Access-Control-Allow-Headers","Content-Type, x-requested-with, access-token");

???????????????????response.addHeader("Access-Control-Max-Age","1800");

???????????????????response.addHeader("Access-Control-Allow-Credentials","true");

???????????????????isValid =true;

??????????????????? break;

???????????????}

??????????? }

??????? }

returnisValid;

???}

@Override

???public voiddestroy() {

??? }

}

以上四種方案好像所以的看上去都是那么簡單,沒什么難度媳否。我一開始也是這樣認(rèn)為的栅螟。然而。篱竭。力图。。

過程中遇到如下幾個問題掺逼。

1)我們希望domain可支持的域名是可以動態(tài)配置吃媒,通過公司的配置系統(tǒng)可以動態(tài)獲取allowOrigins。那么方案1被我拋棄了吕喘,因為xml里配置無法動態(tài)生效赘那。因為是基于全局配置,就沒有考慮方案2.

2)我用了spring攔截器方式CrossDomainInterceptor氯质,或者CrossDomainFilter extends OncePerRequestFilter募舟。就是這個過程都被spring管理著。但是出現(xiàn)了狀況:

A病梢、請求依然403. 原因:經(jīng)過各種嘗試發(fā)現(xiàn)胃珍,Access-Control-Allow-Credentials梁肿、Access-Control-Allow-Headers有設(shè)置時,Access-Control-Allow-Origin 不要設(shè)置成 *觅彰。并且Access-Control-Allow-Headers 需要和前端傳上來的header 參數(shù)名匹配上吩蔑,否則很容易403.

B、解決了測試環(huán)境的403之后填抬,有同學(xué)又反應(yīng)本地開發(fā)環(huán)境出現(xiàn)“Invalid Cors Request”烛芬。找了4個同學(xué)本地postman請求服務(wù)端接口,2個同學(xué)反應(yīng)沒有問題飒责,2個同學(xué)反應(yīng)出現(xiàn)“Invalid Cors Request”赘娄。這里很難理解,postman里的請求就是簡單的接口測試宏蛉,不存在跨域問題遣臼,無法理解。解決方案:在網(wǎng)上有看到帖子說是因為多個filter順序問題拾并,其他filter導(dǎo)致了跨域filter出現(xiàn)了問題揍堰。。嗅义。(確實項目還集成了其他需要用到過濾器的地方屏歹,如:安全框架接入)

基于以上出現(xiàn)的狀況,我決定從頭開始之碗,回歸本質(zhì)蝙眶。首先跨域就是需要對瀏覽器PreflightRequest(Options預(yù)檢查請求)。進(jìn)行過濾褪那。那么就定義一個java filter吧幽纷。filter不再繼承OncePerRequestFilter(畢竟讓spring控制后自己就不會關(guān)注那么多了,這未必是好事)武通。然后把filter配置到web.xml(可以決定filter的順序霹崎,也為了解決以上最后提到的filter順序問題)珊搀。代碼參考方案4冶忱。結(jié)果嘛,自然是一切就那么好起來了境析。

Access-Control-Allow-Headers 需要支持前端傳上來的參數(shù)囚枪。

Access-Control-Allow-Credentials、Access-Control-Allow-Headers有設(shè)置時劳淆,Access-Control-Allow-Origin 不要設(shè)置成 *链沼,只能支持一個。

注意過濾器的順序問題沛鸵。(即括勺,你需要先做哪一步過濾)


引用一些參考的文章:

https://blog.csdn.net/dalangzhonghangxing/article/details/52911230

https://blog.csdn.net/pinebud55/article/details/60874725

https://segmentfault.com/a/1190000012469713

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缆八,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子疾捍,更是在濱河造成了極大的恐慌奈辰,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乱豆,死亡現(xiàn)場離奇詭異奖恰,居然都是意外死亡,警方通過查閱死者的電腦和手機宛裕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門瑟啃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人揩尸,你說我怎么就攤上這事蛹屿。” “怎么了岩榆?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵蜡峰,是天一觀的道長。 經(jīng)常有香客問我朗恳,道長湿颅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任粥诫,我火速辦了婚禮油航,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘怀浆。我一直安慰自己谊囚,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布执赡。 她就那樣靜靜地躺著镰踏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沙合。 梳的紋絲不亂的頭發(fā)上奠伪,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機與錄音首懈,去河邊找鬼绊率。 笑死,一個胖子當(dāng)著我的面吹牛究履,可吹牛的內(nèi)容都是我干的滤否。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼最仑,長吁一口氣:“原來是場噩夢啊……” “哼藐俺!你這毒婦竟也來了炊甲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤欲芹,失蹤者是張志新(化名)和其女友劉穎蜜葱,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耀石,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡牵囤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了滞伟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揭鳞。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖梆奈,靈堂內(nèi)的尸體忽然破棺而出野崇,到底是詐尸還是另有隱情,我是刑警寧澤亩钟,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布乓梨,位于F島的核電站,受9級特大地震影響清酥,放射性物質(zhì)發(fā)生泄漏扶镀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一焰轻、第九天 我趴在偏房一處隱蔽的房頂上張望臭觉。 院中可真熱鬧,春花似錦辱志、人聲如沸蝠筑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽什乙。三九已至,卻和暖如春已球,著一層夾襖步出監(jiān)牢的瞬間臣镣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工和悦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留退疫,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓鸽素,卻偏偏與公主長得像,于是被迫代替她去往敵國和親亦鳞。 傳聞我的和親對象是個殘疾皇子馍忽,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理棒坏,服務(wù)發(fā)現(xiàn),斷路器遭笋,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 一坝冕、HTTP簡介 HTTP協(xié)議(HyperText Transfer Protocol,超文本傳輸協(xié)議)是用于從w...
    明燕南飛閱讀 303評論 1 0
  • 關(guān)于 springmvc 3.x 版本對ajax跨域請求訪問 ajax 請求后瓦呼,瀏覽器出現(xiàn)跨域的問題那么在當(dāng)前環(huán)境...
    山水風(fēng)情閱讀 510評論 0 0
  • 導(dǎo)入某些特殊Jar包中的類 在通常的開發(fā)中可能會去看下API的源代碼喂窟,自己有時候也可以模仿API中的源代碼做一些研...
    shoage閱讀 188評論 2 0
  • 一、自行下載阿里云證書 此處不再概述 二央串、登陸阿里云之后磨澡,在安全(云盾)板塊下-CA證書服務(wù) 這里選取apac...
    1367bfee4461閱讀 420評論 0 1