Spring Boot中WebMvcConfigurer与CorsFilter的跨域配置场景区分
Spring Boot中WebMvcConfigurer与CorsFilter的CORS配置适用场景解析
问题背景
使用Spring Boot搭建Restful服务时,Angular前端发送HTTP请求遭遇CORS错误。初始通过WebMvcConfigurer Bean配置解决了http://localhost:4200的跨域问题,但将前端部署到http://192.168.5.76:4200后再次触发CORS错误,改用CorsFilter Bean配置后问题解决。查阅资料得知WebMvcConfigurer更被推荐,但对两者的适用场景存在疑问。
初始WebMvcConfigurer配置
@Bean public WebMvcConfigurer corsConfigurer(){ return new WebMvcConfigurer() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("http://localhost:4200") .allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS") .allowedHeaders("*") .allowCredentials(true); } }; }
后续CorsFilter配置
@Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.addAllowedOrigin("http://192.168.5.76:4200"); config.addAllowedOrigin("http://localhost:4200"); config.addAllowedMethod("*"); config.addAllowedHeader("*"); source.registerCorsConfiguration("/**", config); return new CorsFilter(source); }
一、WebMvcConfigurer的CORS配置
- 本质:属于Spring MVC层面的扩展配置,通过实现
WebMvcConfigurer接口的addCorsMappings方法,在DispatcherServlet内部定义CORS规则。 - 适用场景:
- 仅需对Spring MVC接管的请求生效,比如
@Controller、@RestController映射的RESTful接口。 - 常规业务接口的跨域需求,配置简洁,贴合Spring MVC的设计规范。
- 需要针对不同接口路径设置差异化CORS规则的场景,支持细粒度路径映射。
- 仅需对Spring MVC接管的请求生效,比如
- 局限性:
- 无法覆盖非DispatcherServlet处理的请求,比如Tomcat直接托管的静态资源、部分Actuator端点。
- 若Filter链中存在优先级更高的拦截Filter,可能导致CORS规则无法生效。
二、CorsFilter的CORS配置
- 本质:属于Servlet Filter层面的全局配置,在请求进入Spring MVC之前就完成CORS规则的校验与处理。
- 适用场景:
- 需要对所有进入应用的请求生效,包括静态资源、Actuator端点等非MVC请求。
- 应用中存在安全框架Filter(如Spring Security)时,可通过自定义CorsFilter调整执行顺序,避免跨域逻辑被提前拦截。
- 多Origin的全局统一跨域配置场景。
- 局限性:
- 配置相对繁琐,不如WebMvcConfigurer贴合Spring MVC的接口设计。
- 细粒度路径规则的配置灵活性低于WebMvcConfigurer。
三、核心差异与选择建议
- 执行时机:CorsFilter在Servlet容器层面优先执行,WebMvcConfigurer的配置在DispatcherServlet内部执行。
- 覆盖范围:CorsFilter覆盖所有请求,WebMvcConfigurer仅覆盖Spring MVC处理的请求。
- 选择原则:
- 常规RESTful服务,仅需对Controller接口配置跨域时,优先使用WebMvcConfigurer,符合Spring生态的设计规范。
- 若需覆盖静态资源、Actuator端点等非MVC请求,或需调整Filter执行顺序解决冲突,选择CorsFilter。
内容的提问来源于stack exchange,提问作者canercin
相关产品推荐
相关产品推荐

