解決SpringBoot自定義攔截器和跨域配置沖突的問題
SpringBoot自定義攔截器和跨域配置沖突
技術(shù)棧
vue-cli3,springboot 2.3.2.RELEASE
問題引出
在做畢業(yè)設(shè)計過程中用到了自定義攔截器驗證登錄。同時在springboot配置類中設(shè)置了跨域問題,出現(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/*");
}
}
經(jīng)過了解和排查發(fā)現(xiàn),當(dāng)有請求發(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處理的,可以很好的解決問題?! ?/p>
最近,新項目中準(zhǔn)備通過如下代碼解決跨域問題,結(jié)果發(fā)現(xiàn)登錄超時的錯誤會出現(xiàn)跨域問題,其他問題都不會。
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
}
}
因為登錄超時的檢查是在攔截器中,所以推測是可能是攔截器的執(zhí)行在addCorsMappings生效之前。將CorsFilter代碼拿到項目中后,果然沒有這個問題了。所以這個bu基本上可以認(rèn)定是是攔截器和addCorsMappings生效順序的問題。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring5使用JSR 330標(biāo)準(zhǔn)注解的方法
從Spring3.0之后,除了Spring自帶的注解,我們也可以使用JSR330的標(biāo)準(zhǔn)注解,本文主要介紹了Spring5使用JSR 330標(biāo)準(zhǔn)注解,感興趣的可以了解一下2021-09-09
Spring Boot實現(xiàn)簡單的定時任務(wù)
這篇文章主要給大家介紹了關(guān)于利用Spring Boot實現(xiàn)簡單的定時任務(wù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
SpringBoot中的@ApiModelProperty注解作用
這篇文章主要介紹了SpringBoot中的@ApiModelProperty注解作用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教。2022-01-01

