解決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。

推薦閱讀: