很多小伙伴做前后端联调时,90% 都会遇到跨域CORS报错:
Access to fetch at ‘xxx’ from origin ‘xxx’ has been blocked by CORS policy
网上教程五花八门:有的让加 @CrossOrigin、有的改配置、有的加拦截器。很多人只会“复制粘贴解决”,根本不懂原理,线上环境经常翻车!
今天我整理一份 SpringBoot 跨域终极解决方案,涵盖:局部解决、全局解决、过滤器解决,适配开发、测试、生产所有场景,看完彻底告别跨域问题。
一、为什么会出现跨域?
浏览器同源策略限制:协议、域名、端口任意一个不同,即为跨域。
前端Vue/React本地端口、后端Java端口不一致,本地联调必现跨域。
注意:跨域是浏览器限制,不是后端Bug!
二、方式一:单个接口跨域(适合临时测试)
直接在 Controller 方法/类上添加注解,最简单,适合快速调试。
@RestController
@RequestMapping(“/user”)
@CrossOrigin
public class UserController {
@GetMapping("/list") public Result list(){ return Result.success(); }}
缺点:每个类都要加,项目大了难以维护,不推荐生产使用。
三、方式二:全局跨域配置(推荐!企业主流写法)
只需要一个配置类,全局所有接口自动跨域,干净优雅,企业项目通用。
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") // 允许所有来源 .allowedOriginPatterns("*") // 允许请求方式 .allowedMethods("GET","POST","PUT","DELETE","OPTIONS") // 允许所有请求头 .allowedHeaders("*") // 允许携带Cookie .allowCredentials(true) .maxAge(3600); }}
适配 SpringBoot2.x / SpringBoot3.x,无需额外依赖。
四、方式三:过滤器统一处理跨域(解决特殊拦截器冲突)
如果项目有拦截器、权限校验,上面配置偶尔失效,用过滤器方案稳得一批。
@Component
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletResponse res = (HttpServletResponse) response;
res.setHeader(“Access-Control-Allow-Origin”, “");
res.setHeader(“Access-Control-Allow-Methods”, “GET,POST,PUT,DELETE,OPTIONS”);
res.setHeader(“Access-Control-Allow-Headers”, "”);
chain.doFilter(request,response);
}
}
五、常见跨域踩坑点
- allowCredentials=true 不能搭配 * 通配符,高版本会报错
- OPTIONS 预请求不通过,会直接拦截请求
- 拦截器执行顺序优先于跨域配置,会导致跨域失效
- 生产环境不要直接开 *,可配置前端固定域名更安全
六、总结
日常开发优先使用 全局Cors配置类,简单稳定、无侵入、适合所有业务项目。
学会这一套,以后面试被问跨域、线上解决跨域问题直接拿捏!
需要完整 SpringBoot 统一跨域+权限拦截兼容版源码 可以评论区留言!