目录
一、@CrossOrigin
二 、@addCrosMapping
三、CrosFilter
一、@CrossOrigin
spring 中第一种跨域的方式是通过 @CrossOrigin 注解来标记支持跨域,该组件可以添加在方法上,也可以添加在 Controller 上。当添加在 Controller上时,表示 Controller中所有接口都支持跨域,具体配置如下:
@RestController
// 放在类上表示当前类的所有接口都支持跨域
@CrossOrigin(origins = {"http://localhost:63342"})
public class IndexController {
@GetMapping("/demo")
/**
* origins : 表示允许哪些域进行跨域操作 * 代表所有域
*
*/
@CrossOrigin(origins = {"http://localhost:63342"})
public String demo(){
System.out.println("demo ok !");
return "demo ok !";
}
}
@CrossOrigin 注解各属性含义如下:
- alowCredentials :浏览器是否应当发送凭证信息,如 Cookie。
- allowedHeaders:请求被允许的请求头字段,
*
表示所有字段。 - exposedHeadrs :哪些响应头可以作为响应的一部分暴露出来。
注意,这里只可以一一列举,通配符 * 在这里是无效的。
- maxAge :预检请求的有效期,有效期内不必再次发送预检请求,默认是
1800
秒。 - methods:允许的请求方法,
*
表示允许所有方法。 - origins:允许的域,
*
表示允许所有域。
二、@addCrosMapping
@CrossOrigin 注解需要添加在不同的 Controller 上。所以还有一种全局配置方法,就是通过重写 WebMvcConfiurerCompsite # addCorsMappings方法来实现,具体配置如下:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
/**
* 通过修改 WebMvc 配置设置为跨域 ,底层是通过 Interceptor 实现
* @param registry
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // 处理请求的路径
.allowCredentials(false) // 是否生成凭证
.allowedHeaders("*") // 允许携带哪些请求头信息
.allowedMethods("*") // 允许哪些方法
.allowedOrigins("*") // 允许哪些域进行方法
.exposedHeaders() // 响应哪些响应头信息
.maxAge(3600); // 预检请求的时长
}
}
三、CrosFilter
CosrFilter 是 Spring Web 中提供的一个处理跨域的过滤器,开发者也可以通过该过滤器处理跨域。
@Configuration
public class WebMvcConfig2{
/**
* 过滤器注册器
* @return 返回一个Cors过滤器
*/
@Bean
FilterRegistrationBean<CorsFilter> corsFilter (){
// 过滤器注册器
FilterRegistrationBean<CorsFilter> corsFilterFilterRegistrationBean= new FilterRegistrationBean<>();
// Cors配置类
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.setAllowCredentials(false); // 是否返回时生成凭证
corsConfiguration.setAllowedHeaders(Arrays.asList("*")); // 允许请求携带哪些请求头信息
corsConfiguration.setAllowedMethods(Arrays.asList("*")); // 允许哪些类型的请求方法
corsConfiguration.setAllowedOrigins(Arrays.asList("*")); // 允许哪些域可以进行方法
corsConfiguration.setMaxAge(3600L); // 设置预检的最大的时长
corsConfiguration.setExposedHeaders(Collections.emptyList()); // 设置返回暴露的响应头信息
// 设置注册URL 配置类
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource() ;
source.registerCorsConfiguration("/**",corsConfiguration);
// 注册Filter
corsFilterFilterRegistrationBean.setFilter(new CorsFilter(source));
corsFilterFilterRegistrationBean.setOrder(-1); // 设置 Filter的执行顺序 -1 表示最先执行,如果有其他的也配置-1 则以类加载为准
return corsFilterFilterRegistrationBean;
}
}