SpringBoot中CorsMappings和Interceptor发生冲突失效
在前后端分离的项目中,必定会遇到请求跨域的问题,我们解决跨域一般有两种情况,往下看:
第一种方法就是自定义一个跨域Bean:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration public class CorsConfiguration { @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**").allowCredentials(false) .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE").allowedOrigins("*"); } }; }
}
|
从代码中我们可以看到,其实就是定义了一个WebMvcConfigurer
的实例,然后实现了addCorsMappings()
方法,在方法中进行了跨域注册,这里的代码中设置的addMapping("/**")
,意思是所有的资源(动态+静态)均允许跨域,如果仅仅设置某些资源允许跨域请求,这里只需要指定响应的路径即可,例如addMapping("/doc.html")
,多个路径的话,设置多条即可。
第二种方法则是定义一个WebMvcConfigurer
的子类,在子类中实现addCorsMappings
方法,方法内容和第一种相似,就不细讲了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import org.springframework.context.annotation.Configuration; import org.springframework.web.filter.CorsFilter; import org.springframework.web.servlet.config.annotation.*;
@Configuration @EnableWebMvc public class HttpConverterConfig implements WebMvcConfigurer {
@Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**").allowCredentials(false).allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE") .allowedOrigins("*"); }
}
|
第三种方法,是自定义CorsFilter
的实例,并将其注册到Spring容器中,在项目中使用了拦截器HandlerInterceptor
的时候,只有使用该方法才能设置成功:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; import org.springframework.web.servlet.config.annotation.*;
@Configuration @EnableWebMvc public class HttpConverterConfig implements WebMvcConfigurer {
@Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginInterceptor()).addPathPatterns("/**").excludePathPatterns("/login", "/doc**", "/swagger**", "/webjars/**"); }
@Bean public CorsFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration(); config.addAllowedOrigin("*"); config.addAllowedMethod("*"); config.addAllowedHeader("*"); config.addExposedHeader("token"); UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource(); configSource.registerCorsConfiguration("/**", config); return new CorsFilter(configSource); }
@Bean public LoginInterceptor loginInterceptor() { return new LoginInterceptor(); }
}
|