解決SpringBoot自定義攔截器和跨域配置沖突的問題
SpringBoot自定義攔截器和跨域配置沖突
技術棧
vue-cli3,springboot 2.3.2.RELEASE
問題引出
在做畢業(yè)設計過程中用到了自定義攔截器驗證登錄。同時在springboot配置類中設置了跨域問題,出現(xiàn)跨域失敗的情況。
原代碼
@Configuration public class WebConfig extends WebMvcConfigurationSupport { @Override protected void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("GET", "HEAD", "POST","PUT", "DELETE", "OPTIONS") .allowedHeaders("*") .maxAge(3600); super.addCorsMappings(registry); } @Override protected void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AuthInterceptor()) .addPathPatterns("/**") .excludePathPatterns("/login/*","/register/*"); } }
經過了解和排查發(fā)現(xiàn),當有請求發(fā)送到后臺時,先被自定義攔截器攔截,如果攔截器驗證沒有問題,才會開始執(zhí)行跨域配置。因此解決辦法是讓跨域配置在自定義攔截器之前執(zhí)行。而Filter的執(zhí)行順序大于自定義攔截器,因此可以在Filter中實現(xiàn)跨域的配置。
新代碼
@Configuration public class WebConfig extends WebMvcConfigurationSupport { @Override protected void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AuthInterceptor()) .addPathPatterns("/**") .excludePathPatterns("/login/*","/register/*"); } }
添加Filter
@Configuration public class MyCorsFilter{ private CorsConfiguration corsConfig(){ CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedHeader("*"); corsConfiguration.addAllowedMethod("*"); corsConfiguration.addAllowedOrigin("*"); corsConfiguration.setMaxAge(3600L); corsConfiguration.setAllowCredentials(true); return corsConfiguration; } @Bean public CorsFilter corsFilter(){ UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**",corsConfig()); return new CorsFilter(source); } }
SpringBoot 攔截器和addCorsMappings沖突
項目中最開始跨域問題是通過自定義過濾器CorsFilter對request處理的,可以很好的解決問題。
最近,新項目中準備通過如下代碼解決跨域問題,結果發(fā)現(xiàn)登錄超時的錯誤會出現(xiàn)跨域問題,其他問題都不會。
@Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**"); } }
因為登錄超時的檢查是在攔截器中,所以推測是可能是攔截器的執(zhí)行在addCorsMappings生效之前。將CorsFilter代碼拿到項目中后,果然沒有這個問題了。所以這個bu基本上可以認定是是攔截器和addCorsMappings生效順序的問題。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
阿里巴巴 Sentinel + InfluxDB + Chronograf 實現(xiàn)監(jiān)控大屏
這篇文章主要介紹了阿里巴巴 Sentinel + InfluxDB + Chronograf 實現(xiàn)監(jiān)控大屏,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09Java中List集合去除重復數(shù)據(jù)的方法匯總
這篇文章主要給大家介紹了關于Java中List集合去除重復數(shù)據(jù)的方法,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02