Spring的CorsFilter會(huì)失效的原因及解決方法
1. 背景分析
眾所周知CorsFilter是Spring提供的跨域過(guò)濾器,我們可能會(huì)做以下的配置,基本上就是允許任何跨域請(qǐng)求
@Configuration public class CorsConfig { @Bean public CorsFilter corsFilter() { CorsConfiguration config = new CorsConfiguration(); //允許所有域名進(jìn)行跨域調(diào)用 config.addAllowedOriginPattern("*"); //允許跨越發(fā)送cookie config.setAllowCredentials(true); //放行全部原始頭信息 config.addAllowedHeader("*"); //允許所有請(qǐng)求方法跨域調(diào)用 config.addAllowedMethod("*"); //跨域允許時(shí)間,單位:秒 config.setMaxAge(60 * 60L); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", config); return new CorsFilter(source); } }
我們的系統(tǒng)主要是SpringBoot+SpringSecurity構(gòu)成的,我利用Spring的CorsFilter做跨域操作也沒(méi)問(wèn)題吧
但就是在這種簡(jiǎn)單的情況下前端還是爆出了跨域情況
這就頭大了呀,畢竟網(wǎng)上的教程和我的經(jīng)驗(yàn)分析都覺(jué)得是可以的
2. 問(wèn)題分析
這個(gè)時(shí)候就沒(méi)辦法了,只能本地Debug + 分析源碼,看看問(wèn)題所在地
然后我是利用Apifox里面保存的請(qǐng)求實(shí)例,然后復(fù)制一份(這里面有系統(tǒng)的認(rèn)證參數(shù)
),請(qǐng)求方式改為了OPTIAN了,然后其他雜七雜八的請(qǐng)求頭也從前端中復(fù)制到新的請(qǐng)求實(shí)例中了
然后啟動(dòng)項(xiàng)目,打好斷點(diǎn)
最終發(fā)現(xiàn)進(jìn)入了CorsFilter的doFilterInternal方法,并且判斷成功,確實(shí)是一個(gè)OPTIAON, 響應(yīng)頭也已經(jīng)填充了對(duì)應(yīng)的響應(yīng)頭,ApiFox也提示請(qǐng)求正常
這就離譜了,dev環(huán)境不可以,local環(huán)境就可以了,這個(gè)時(shí)候我決定不偷懶了,新建一個(gè)請(qǐng)求實(shí)例,完全照搬前端發(fā)起的請(qǐng)求
這個(gè)時(shí)候問(wèn)題就稍微浮出水面了,我發(fā)現(xiàn)CorsFilter
都沒(méi)進(jìn)去,Apifox就已經(jīng)提示了跨域了
于是我繼續(xù)分析向上的流程,大家看下面的這個(gè)圖,這是注冊(cè)到Tomcat中的過(guò)濾器組成的過(guò)濾器鏈
先看前三個(gè)過(guò)濾器:
- OrderedCharacterEncodingFilter:確認(rèn)本次請(qǐng)求的編碼格式
- OrderedCharacterEncodingFilter:為PUT、PATCH、DELETE這樣的請(qǐng)求方式,將請(qǐng)求體轉(zhuǎn)為鍵值對(duì)形式,然后通過(guò) getParameter 讀取
- OrderedRequestContextFilter:用于初始化 LocaleContextHolder 和 RequestContextHolder 的過(guò)濾器
然后我們?cè)倏春竺娴?code>springSecurityFilterChain和corsFilter
,注意這里是springSecurityFilterChain
在前,也就是會(huì)先執(zhí)行
我最新的這一次跨域請(qǐng)求是沒(méi)有攜帶認(rèn)證參數(shù)的,也就是說(shuō)會(huì)被SpringSecurity的ExceptionTranslationFilter
處理訪問(wèn)被拒絕異常,也就不會(huì)走后面的corsFilter
,也就不會(huì)寫(xiě)入響應(yīng)頭的相關(guān)參數(shù)了
3. 解決辦法
3.1 SpringSecurity的角度
問(wèn)題分析到這其實(shí)解決思路就很簡(jiǎn)單了,要么我們改用SpringSecurity提供的跨域支持,就像下面這樣
3.2 SpringBoot的角度
要么我們就改變注冊(cè)到Tomcat的CorsFilter
的執(zhí)行順序,我當(dāng)時(shí)也是這樣處理的,看下圖我介紹的三個(gè)過(guò)濾器均在 springSecurityFilterChain
之前執(zhí)行,并且他們的順序是保持一致的,也就是SpringBoot一定做了排序的
我們可以先看這三個(gè)過(guò)濾器的共同點(diǎn):他們都同時(shí)實(shí)現(xiàn)了OrderedFilter
接口,并且重寫(xiě)getOrder()
方法
在這種情況下,我就自己寫(xiě)了一個(gè)CorsFilter, 并實(shí)現(xiàn)了OrderedFilter
然后我們就可以發(fā)現(xiàn)過(guò)濾器的順序發(fā)生了變化
前端也正常的發(fā)起了跨域請(qǐng)求,業(yè)務(wù)流程也可以繼續(xù)跑了
4. 總結(jié)
總結(jié):
- 其實(shí)跨域問(wèn)題很好解決,本質(zhì)上就是后端要設(shè)置對(duì)應(yīng)的響應(yīng)頭
- 我這里出現(xiàn)問(wèn)題還是因?yàn)樽约和祽辛?,直接?fù)制以前的請(qǐng)求實(shí)例發(fā)起OPTION請(qǐng)求
- 還有就是沒(méi)想起來(lái)SpringBoot和SpringSecurtiy中處理跨域會(huì)有一個(gè)先后順序(沖突)的問(wèn)題才導(dǎo)致的
- 當(dāng)然Spring中處理跨域其實(shí)不只CorsFilter這一種方式,還可以通過(guò)
RequestMappingHandlerMapping
完成,就在下面的地方,這個(gè)后續(xù)在介紹
以上就是Spring的CorsFilter會(huì)失效的原因及解決方法的詳細(xì)內(nèi)容,更多關(guān)于Spring CorsFilter失效的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java常見(jiàn)啟動(dòng)命令-jar、-server和-cp詳細(xì)比較
這篇文章主要給大家介紹了關(guān)于Java常見(jiàn)啟動(dòng)命令-jar、-server和-cp詳細(xì)比較的相關(guān)資料,該文總結(jié)了常歸的jar包的啟動(dòng)方式,并分析各種啟動(dòng)方式的區(qū)別,需要的朋友可以參考下2023-07-07Java SpringBoot模板引擎之 Thymeleaf入門詳解
jsp有著強(qiáng)大的功能,能查出一些數(shù)據(jù)轉(zhuǎn)發(fā)到JSP頁(yè)面以后,我們可以用jsp輕松實(shí)現(xiàn)數(shù)據(jù)的顯示及交互等,包括能寫(xiě)Java代碼。但是,SpringBoot首先是以jar的方式,不是war;其次我們的tomcat是嵌入式的,所以現(xiàn)在默認(rèn)不支持jsp2021-10-10在IDEA中實(shí)現(xiàn)生成Maven依賴關(guān)系圖
這篇文章主要介紹了在IDEA中實(shí)現(xiàn)生成Maven依賴關(guān)系圖方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07java學(xué)習(xí)之jar包的下載和導(dǎo)入
我們經(jīng)常碰到有些jar包在中央倉(cāng)庫(kù)沒(méi)有的情況,這時(shí)候我們需要導(dǎo)入,這篇文章主要給大家介紹了關(guān)于java學(xué)習(xí)之jar包的下載和導(dǎo)入的相關(guān)資料,需要的朋友可以參考下2023-06-06SpringBoot整合RestTemplate用法的實(shí)現(xiàn)
本篇主要介紹了RestTemplate中的GET,POST,PUT,DELETE、文件上傳和文件下載6大常用的功能,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08專屬于程序員的浪漫-Java輸出動(dòng)態(tài)閃圖iloveyou
這篇文章主要介紹了專屬于程序員的浪漫-Java輸出動(dòng)態(tài)閃圖iloveyou,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-112020.2 IntelliJ IDEA激活與IDEA2020.2破解詳細(xì)教程
這篇文章主要介紹了2020.2 IntelliJ IDEA激活與IDEA2020.2破解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08