SpringMVC CORS配置
SpringMVC提供多种CORS配置方式,灵活应对不同场景需求。
@CrossOrigin注解配置
在Controller方法上使用
Java
@RestController
@RequestMapping("/api")
public class UserController {
@CrossOrigin(origins = "http://localhost:3000")
@GetMapping("/users")
public List<User> getUsers() {
return userService.findAll();
}
}
在Controller类上使用
Java
@CrossOrigin(
origins = "http://localhost:3000",
methods = {RequestMethod.GET, RequestMethod.POST},
allowedHeaders = {"Content-Type", "Authorization"},
maxAge = 3600
)
@RestController
@RequestMapping("/api")
public class UserController {
// 所有方法都应用CORS配置
}
注解属性说明
| 属性 | 说明 | 示例 |
|---|---|---|
| origins | 允许的源 | {"http://a.com", "http://b.com"} |
| methods | 允许的方法 | {RequestMethod.GET, RequestMethod.POST} |
| allowedHeaders | 允许的请求头 | {"Content-Type", "Authorization"} |
| exposedHeaders | 暴露的响应头 | {"X-Custom-Header"} |
| allowCredentials | 允许凭证 | true |
| maxAge | 预检缓存时间 | 3600 |
全局CORS配置
实现WebMvcConfigurer接口
Java
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://localhost:3000", "http://localhost:4000")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(3600);
}
}
多路径配置
Java
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
// API接口配置
registry.addMapping("/api/**")
.allowedOrigins("http://localhost:3000")
.allowedMethods("*")
.allowCredentials(true);
// 静态资源配置
registry.addMapping("/static/**")
.allowedOrigins("*")
.allowedMethods("GET");
}
}
CorsFilter过滤器配置
基于Filter的配置
Java
@Configuration
public class CorsFilterConfig {
@Bean
public FilterRegistrationBean<CorsFilter> corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.setAllowedOrigins(Arrays.asList("http://localhost:3000"));
config.setAllowedMethods(Arrays.asList("*"));
config.setAllowedHeaders(Arrays.asList("*"));
config.setAllowCredentials(true);
config.setMaxAge(3600L);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source));
bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
return bean;
}
}
XML配置方式
XML
<mvc:cors>
<mvc:mapping path="/api/**"
allowed-origins="http://localhost:3000"
allowed-methods="GET,POST,PUT,DELETE"
allowed-headers="*"
allow-credentials="true"
max-age="3600"/>
</mvc:cors>
配置方式对比
| 方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| @CrossOrigin | 简单灵活,细粒度控制 | 分散在各处 | 单个接口特殊配置 |
| WebMvcConfigurer | 统一管理,配置集中 | 不够灵活 | 大部分项目 |
| CorsFilter | 优先级高,全局生效 | 配置稍复杂 | 需要高优先级拦截 |
| XML | 传统方式,兼容性好 | 配置繁琐 | 老项目维护 |
要点总结
- @CrossOrigin适用于方法级别细粒度配置
- WebMvcConfigurer是最常用的全局配置方式
- CorsFilter优先级最高,适合特殊需求
- allowCredentials为true时origins不能为*
- 根据项目需求选择合适的配置方式
📝 发现内容有误?点击此处直接编辑