背景
现在做的很多项目都是前后端分离的,这就引出一个很常见的问题,我们的页面和接口是在不同域名下的,当我们通过ajax访问后端接口的时候就会出现跨域问题,这种问题我们怎么解决呢?一般来说就是cors和jsonp这两种方案。Spring简化了cors的配置,接下来我们来看一下它提供的cors。
WebMvcConfigurer对象
我们可以初始化一个WebMvcConfigurer
对象来配置我们的cors映射。
@Configuration
public class CorsCongiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**"); // 允许所有第三方域名访问该接口
// .allowedOrigins("http://domain2.com")//指定来源域名
// .allowedMethods("PUT", "DELETE")
// .allowedHeaders("header1", "header2", "header3")
// .exposedHeaders("header1", "header2")
// .allowCredentials(false).maxAge(3600);
}
};
}
}
继承WebMvcConfigurerAdapter
这种方式跟上面的方式很类似
@Configuration
@EnableWebMvc
public class CorsConfiguration_2 extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**");
}
}
corsFilter
这种方式现在很少用
@Component
@EnableWebMvc
public class CorsFilterCongiguration extends CorsFilter {
public CorsFilterCongiguration(CorsConfigurationSource configSource) {
super(configSource);
}
@Bean
public FilterRegistrationBean corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");
// config.addAllowedOrigin("http://domain1.com");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/api/**", config);
FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
bean.setOrder(0); // 必须在所有Filter之前
return bean;
}
}