解決SpringBoot自定義攔截器和跨域配置沖突的問題
SpringBoot自定義攔截器和跨域配置沖突
技術棧
vue-cli3,springboot 2.3.2.RELEASE
問題引出
在做畢業設計過程中用到瞭自定義攔截器驗證登錄。同時在springboot配置類中設置瞭跨域問題,出現跨域失敗的情況。
原代碼
@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/*"); } }
經過瞭解和排查發現,當有請求發送到後臺時,先被自定義攔截器攔截,如果攔截器驗證沒有問題,才會開始執行跨域配置。因此解決辦法是讓跨域配置在自定義攔截器之前執行。而Filter的執行順序大於自定義攔截器,因此可以在Filter中實現跨域的配置。
新代碼
@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處理的,可以很好的解決問題。
最近,新項目中準備通過如下代碼解決跨域問題,結果發現登錄超時的錯誤會出現跨域問題,其他問題都不會。
@Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**"); } }
因為登錄超時的檢查是在攔截器中,所以推測是可能是攔截器的執行在addCorsMappings生效之前。將CorsFilter代碼拿到項目中後,果然沒有這個問題瞭。所以這個bu基本上可以認定是是攔截器和addCorsMappings生效順序的問題。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 關於springboot2.4跨域配置問題
- springboot 設置CorsFilter跨域不生效的解決
- 最新springboot解決跨域的幾種方式小結
- SpringBoot+Spring Security無法實現跨域的解決方案
- SpringBoot開發技巧之如何處理跨域請求CORS