springboot怎么配置跨域?

一、在接口/类上加一个注解@CrossOrign

1
2
3
4
5
@CrossOrigin(origins = {"http://localhost:9000", "null"})
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String greetings() {
return "{\"project\":\"just a test\"}";
}

二、写一个配置类实现WebMvcCofigurerAdapter

1
2
3
4
5
6
7
8
9
10
11
@Configuration
public class CrosConfig extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET","POST", "PUT", "DELETE")
.allowedHeaders("*");
}
}

三、原理刨析

Spring 中对 CORS 规则的校验,都是通过委托给 DefaultCorsProcessor实现的。

DefaultCorsProcessor处理过程如下:

  • 1、首先判断是否为cros请求;如果Header中是否包含Origin,如果有则是,否则不是;
  • 2、然后再判断responseHeader是否已经包含Access-Control-Allow-Origin,如果包含,说明被处理过了,转下一步,否则之后不做处理;
  • 3、判断是否同源,如果是则转交给负责该请求的类处理;
  • 4、不是同源,判断是否配置了cros规则,如果没有配置,且是预检请求,则拒绝该请求,不是预检请求则交给负责该请求的类处理;如果配置了则对该请求进行校验。

校验是根据 CorsConfiguration 这个类的配置进行判断

  1. 判断 origin 是否合法
  2. 判断 method 是否合法
  3. 判断 header是否合法
  4. 如果全部合法,则在 response header中添加响应的字段,并交给负责该请求的类处理,如果不合法,则拒绝该请求。