欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring的CorsFilter會(huì)失效的原因及解決方法

 更新時(shí)間:2023年09月28日 11:11:04   作者:帆_布  
眾所周知CorsFilter是Spring提供的跨域過(guò)濾器,我們可能會(huì)做以下的配置,基本上就是允許任何跨域請(qǐng)求,我利用Spring的CorsFilter做跨域操作但是出現(xiàn)報(bào)錯(cuò),接下來(lái)小編就給大家介紹一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循環(huán)隊(duì)列原理與用法詳解

    Java循環(huán)隊(duì)列原理與用法詳解

    這篇文章主要介紹了Java循環(huán)隊(duì)列原理與用法,結(jié)合實(shí)例形式詳細(xì)分析了Java循環(huán)隊(duì)列基本概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2020-03-03
  • Java常見(jiàn)啟動(dòng)命令-jar、-server和-cp詳細(xì)比較

    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-07
  • Java SpringBoot模板引擎之 Thymeleaf入門詳解

    Java 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)不支持jsp
    2021-10-10
  • 在IDEA中實(shí)現(xiàn)生成Maven依賴關(guān)系圖

    在IDEA中實(shí)現(xiàn)生成Maven依賴關(guān)系圖

    這篇文章主要介紹了在IDEA中實(shí)現(xiàn)生成Maven依賴關(guān)系圖方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Spring創(chuàng)建IOC容器的方式解析

    Spring創(chuàng)建IOC容器的方式解析

    這篇文章主要介紹了Spring創(chuàng)建IOC容器的方式解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • java學(xué)習(xí)之jar包的下載和導(dǎo)入

    java學(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-06
  • SpringBoot整合RestTemplate用法的實(shí)現(xiàn)

    SpringBoot整合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

    這篇文章主要介紹了專屬于程序員的浪漫-Java輸出動(dòng)態(tài)閃圖iloveyou,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • shiro之記住登錄信息

    shiro之記住登錄信息

    Shiro提供了記住我(RememberMe)的功能,當(dāng)關(guān)閉瀏覽器時(shí)下次再次打開(kāi)還能記住你的信息,下面小編給大家分享shiro之記住登錄信息的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2017-09-09
  • 2020.2 IntelliJ IDEA激活與IDEA2020.2破解詳細(xì)教程

    2020.2 IntelliJ IDEA激活與IDEA2020.2破解詳細(xì)教程

    這篇文章主要介紹了2020.2 IntelliJ IDEA激活與IDEA2020.2破解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08

最新評(píng)論