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