亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring的CorsFilter會失效的原因及解決方法

 更新時間:2023年09月28日 11:11:04   作者:帆_布  
眾所周知CorsFilter是Spring提供的跨域過濾器,我們可能會做以下的配置,基本上就是允許任何跨域請求,我利用Spring的CorsFilter做跨域操作但是出現(xiàn)報錯,接下來小編就給大家介紹一Spring的CorsFilter會失效的原因及解決方法,需要的朋友可以參考下

1. 背景分析

眾所周知CorsFilter是Spring提供的跨域過濾器,我們可能會做以下的配置,基本上就是允許任何跨域請求

@Configuration
public class CorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        //允許所有域名進行跨域調(diào)用
        config.addAllowedOriginPattern("*");
        //允許跨越發(fā)送cookie
        config.setAllowCredentials(true);
        //放行全部原始頭信息
        config.addAllowedHeader("*");
        //允許所有請求方法跨域調(diào)用
        config.addAllowedMethod("*");
        //跨域允許時間,單位:秒
        config.setMaxAge(60 * 60L);
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}

我們的系統(tǒng)主要是SpringBoot+SpringSecurity構(gòu)成的,我利用Spring的CorsFilter做跨域操作也沒問題吧

但就是在這種簡單的情況下前端還是爆出了跨域情況

這就頭大了呀,畢竟網(wǎng)上的教程和我的經(jīng)驗分析都覺得是可以的

2. 問題分析

這個時候就沒辦法了,只能本地Debug + 分析源碼,看看問題所在地

然后我是利用Apifox里面保存的請求實例,然后復(fù)制一份(這里面有系統(tǒng)的認(rèn)證參數(shù)),請求方式改為了OPTIAN了,然后其他雜七雜八的請求頭也從前端中復(fù)制到新的請求實例中了

然后啟動項目,打好斷點

最終發(fā)現(xiàn)進入了CorsFilter的doFilterInternal方法,并且判斷成功,確實是一個OPTIAON, 響應(yīng)頭也已經(jīng)填充了對應(yīng)的響應(yīng)頭,ApiFox也提示請求正常

這就離譜了,dev環(huán)境不可以,local環(huán)境就可以了,這個時候我決定不偷懶了,新建一個請求實例,完全照搬前端發(fā)起的請求

這個時候問題就稍微浮出水面了,我發(fā)現(xiàn)CorsFilter都沒進去,Apifox就已經(jīng)提示了跨域了

于是我繼續(xù)分析向上的流程,大家看下面的這個圖,這是注冊到Tomcat中的過濾器組成的過濾器鏈

先看前三個過濾器:

  • OrderedCharacterEncodingFilter:確認(rèn)本次請求的編碼格式
  • OrderedCharacterEncodingFilter:為PUT、PATCH、DELETE這樣的請求方式,將請求體轉(zhuǎn)為鍵值對形式,然后通過 getParameter 讀取
  • OrderedRequestContextFilter:用于初始化 LocaleContextHolder 和 RequestContextHolder 的過濾器

然后我們再看后面的springSecurityFilterChaincorsFilter,注意這里是springSecurityFilterChain在前,也就是會先執(zhí)行

我最新的這一次跨域請求是沒有攜帶認(rèn)證參數(shù)的,也就是說會被SpringSecurity的ExceptionTranslationFilter處理訪問被拒絕異常,也就不會走后面的corsFilter,也就不會寫入響應(yīng)頭的相關(guān)參數(shù)了

3. 解決辦法

3.1 SpringSecurity的角度

問題分析到這其實解決思路就很簡單了,要么我們改用SpringSecurity提供的跨域支持,就像下面這樣

3.2 SpringBoot的角度

要么我們就改變注冊到Tomcat的CorsFilter的執(zhí)行順序,我當(dāng)時也是這樣處理的,看下圖我介紹的三個過濾器均在 springSecurityFilterChain之前執(zhí)行,并且他們的順序是保持一致的,也就是SpringBoot一定做了排序的

我們可以先看這三個過濾器的共同點:他們都同時實現(xiàn)了OrderedFilter接口,并且重寫getOrder()方法

在這種情況下,我就自己寫了一個CorsFilter, 并實現(xiàn)了OrderedFilter

然后我們就可以發(fā)現(xiàn)過濾器的順序發(fā)生了變化

前端也正常的發(fā)起了跨域請求,業(yè)務(wù)流程也可以繼續(xù)跑了

4. 總結(jié)

總結(jié):

  • 其實跨域問題很好解決,本質(zhì)上就是后端要設(shè)置對應(yīng)的響應(yīng)頭
  • 我這里出現(xiàn)問題還是因為自己偷懶了,直接復(fù)制以前的請求實例發(fā)起OPTION請求
  • 還有就是沒想起來SpringBoot和SpringSecurtiy中處理跨域會有一個先后順序(沖突)的問題才導(dǎo)致的
  • 當(dāng)然Spring中處理跨域其實不只CorsFilter這一種方式,還可以通過RequestMappingHandlerMapping完成,就在下面的地方,這個后續(xù)在介紹

以上就是Spring的CorsFilter會失效的原因及解決方法的詳細(xì)內(nèi)容,更多關(guān)于Spring CorsFilter失效的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

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

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

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

    Java常見啟動命令-jar、-server和-cp詳細(xì)比較

    這篇文章主要給大家介紹了關(guān)于Java常見啟動命令-jar、-server和-cp詳細(xì)比較的相關(guān)資料,該文總結(jié)了常歸的jar包的啟動方式,并分析各種啟動方式的區(qū)別,需要的朋友可以參考下
    2023-07-07
  • Java SpringBoot模板引擎之 Thymeleaf入門詳解

    Java SpringBoot模板引擎之 Thymeleaf入門詳解

    jsp有著強大的功能,能查出一些數(shù)據(jù)轉(zhuǎn)發(fā)到JSP頁面以后,我們可以用jsp輕松實現(xiàn)數(shù)據(jù)的顯示及交互等,包括能寫Java代碼。但是,SpringBoot首先是以jar的方式,不是war;其次我們的tomcat是嵌入式的,所以現(xiàn)在默認(rèn)不支持jsp
    2021-10-10
  • 在IDEA中實現(xiàn)生成Maven依賴關(guān)系圖

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

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

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

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

    java學(xué)習(xí)之jar包的下載和導(dǎo)入

    我們經(jīng)常碰到有些jar包在中央倉庫沒有的情況,這時候我們需要導(dǎo)入,這篇文章主要給大家介紹了關(guān)于java學(xué)習(xí)之jar包的下載和導(dǎo)入的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • SpringBoot整合RestTemplate用法的實現(xiàn)

    SpringBoot整合RestTemplate用法的實現(xiàn)

    本篇主要介紹了RestTemplate中的GET,POST,PUT,DELETE、文件上傳和文件下載6大常用的功能,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • 專屬于程序員的浪漫-Java輸出動態(tài)閃圖iloveyou

    專屬于程序員的浪漫-Java輸出動態(tài)閃圖iloveyou

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

    shiro之記住登錄信息

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

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

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

最新評論