文章目录
1.注解实现局部跨域
在Controller方法或者类上使用
@CrossOrigin(origins = "http://localhost:8081",maxAge = 3600)
2.实现WebMvcConfigurer接口重写addCorsMappings实现全局跨域(推荐使用)
@Configuration
public class MyCorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("PUT", "DELETE","POST","GET")
.allowedHeaders("*")
.maxAge(3600);
}
}
3.使用拦截器实现全局跨域(个人不建议使用,拦截器有很多副作用,比如静态资源被拦截,index.html欢迎页无法打开等问题,顶不住)
- 编写拦截器
@Component
public class CorsInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");
response.setHeader("Access-Control-Max-Age", "86400");
response.setHeader("Access-Control-Allow-Headers", "*");
// 如果是OPTIONS则结束请求
if (HttpMethod.OPTIONS.toString().equals(request.getMethod())) {
response.setStatus(HttpStatus.NO_CONTENT.value());
return false;
}
return true;
}
}
- 应用拦截器
@Configuration
public class RequestInterceptorConfig extends WebMvcConfigurationSupport {
@Resource
private CorsInterceptor corsInterceptor;
@Override
protected void addInterceptors(InterceptorRegistry registry) {
// 注册跨域拦截器
registry.addInterceptor(corsInterceptor).addPathPatterns("/api/**");
}
}