@CrossOrigin
将其标注在controller上,Controller下的接口全部允许跨域
@Controller
@CrossOrigin
public class TestController {
}
配置全局跨域
@Configuration
public class AppConfigurer implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedHeaders("*")
.allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
.allowCredentials(true)
.maxAge(3600);
}
}
但是如果配置了拦截器的话,在前端发送了非简单的跨域请求的话(比如添加了token),浏览器会自动发送preflight请求(OPTIONS请求),需要拦截器允许该请求,否则会出现跨域错误
简单请求
同时满足两大条件
请求方式:GET、POST、HEAD(注:什么是HEAD请求?HEAD请求和GET本质是一样的,但是HEAD请求不含数据,只有HTTP头部信息)
HTTP头部信息不超过一下几种字段:无自定义头部字段、Accept、Accept-Language、Content-Language、Last-Event-ID、Content-Type(只有三个值application/x-www-form-urlencoded、multipart/form-data、text/plain)
非简单请求
请求方式:PUT、DELETE
自定义头部字段
发送json格式数据
正式通信之前,浏览器会先发送OPTION请求,进行预检,这一次的请求称为“预检请求”
服务器成功响应预检请求后,才会发送真正的请求,并且携带真实数据
配置HandlerInterceptor
public boolean preHandle(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler) throws Exception {
if (request.getMethod().equalsIgnoreCase("OPTIONS")) {
return true;
}
return true;
}