本地联调前后端分离项目,由于端口不一样会导致跨域问题,这里介绍三种通过后端放通的方式去调整。
以下都是以springboot 工程为例
一、通过注册FilterRegistrationBean 实现
@Configuration
public class CorsConfig {
@Bean
public FilterRegistrationBean corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(false);
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**",config);
FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean(new CorsFilter(source));
bean.setOrder(0);
return bean;
}
}
二、实现WebMvcConfigurer的addCorsMappings方法
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("POST","GET","PUT","OPTIONS","DELETE")
.maxAge(3600)
.allowCredentials(true);
}
}
三、@CrossOrigin
在对应的controller 层面 加上@CrossOrigin注解
@CrossOrigin
@RequestMapping("/set")
public class SetController {
private final SetService setService;
public SetController(SetService setService){
this.setService = setService;
}
}
无论是通过哪种方式配置 CORS,其实都是在构造 CorsConfiguration。 一个 CORS 配置用一个 CorsConfiguration类来表示
spring 中 对 CORS
规则校验都是,委托给DefaultCorsProcessor
实现的.
DefaultCorsProcessor
处理过程如下:
1、判断依据是Header
中是否包含Origin
。如果包含则说明为CORS
请求,转到2;否则,不是CORS
请求,不作任何处理。
2、判断response
的Header
是否已经包含Access-Control-Allow-Origin
,如果包含,证明已经被处理过了,继续下一步,否则不再处理。
3、判断是否同源,如果是则转交给负责该请求的类处理。
4、是否配置了CORS
规则,如果没有配置,且是预检请求,则拒绝该请求,如果没有配置,且不是预检请求,则交给负责该请求的类处理。如果配置了,则对该请求进行校验。
校验就是根据CorsConfiguration
这个类的配置进行判断:
1、判断origin
是否合法
2、判断method
是否合法
3、判断header
是否合法
4、如果全部合法,则在response header
中添加响应的字段,并交给负责该请求的类处理,如果不合法,则拒绝该请求。