org.springframework.web.servlet.config.annotation.CorsRegistry
是 Spring MVC 中用于配置跨域资源共享(CORS)的核心类之一。通过 CorsRegistry
,开发者可以全局配置允许的跨域请求来源、方法、头部等信息。
以下是对 CorsRegistry
的常用配置项详解:
1. addMapping(String path)
-
作用:指定需要启用 CORS 的 URL 路径。
-
示例:
registry.addMapping("/api/**");
-
说明:支持通配符
**
匹配多级路径。
2. allowedOrigins(String... origins)
-
作用:设置允许访问的来源(Origin),即请求头中的
Origin
字段值必须在该列表中。 -
示例:
registry.allowedOrigins("https://example.com", "https://test.com");
-
注意:不建议使用
allowedOrigins("*")
来允许所有来源,因为这会带来安全风险,特别是当allowCredentials()
为true
时。
3. allowedOriginPatterns(String... patterns)
- 作用:与
allowedOrigins
类似,但支持通配符模式匹配来源,如"https://*.example.com"
。 - 示例:
registry.allowedOriginPatterns("https://*.example.com");
4. allowedMethods(String... methods)
-
作用:设置允许的 HTTP 方法(GET、POST 等)。
-
示例:
registry.allowedMethods("GET", "POST");
-
默认值:如果不设置,默认允许所有方法。
5. allowedHeaders(String... headers)
-
作用:设置允许的请求头字段。
-
示例:
registry.allowedHeaders("Content-Type", "Authorization");
-
默认值:如果不设置,默认允许所有请求头。
6. exposedHeaders(String... headers)
- 作用:设置哪些响应头可以暴露给客户端(浏览器)。
- 示例:
registry.exposedHeaders("X-Custom-Header");
7. maxAge(long maxAge)
-
作用:设置预检请求(preflight request)缓存时间(单位:秒)。
-
示例:
registry.maxAge(3600); // 缓存1小时
-
默认值:默认为
1800
秒(30 分钟)。
8. allowCredentials(boolean allow)
-
作用:是否允许发送 Cookie 或认证信息(如
withCredentials
)。 -
示例:
registry.allowCredentials(true);
-
注意:如果设置了
allowCredentials(true)
,则不能将allowedOrigins
设置为"*"
,否则会抛出异常。
✅ 配置总结表格
方法名 | 参数类型 | 作用描述 |
---|---|---|
addMapping | String | 指定需要启用 CORS 的 URL 路径 |
allowedOrigins | String... | 设置允许的来源(Origin) |
allowedOriginPatterns | String... | 设置允许的来源模式(支持通配符) |
allowedMethods | String... | 设置允许的 HTTP 方法 |
allowedHeaders | String... | 设置允许的请求头 |
exposedHeaders | String... | 设置可暴露的响应头 |
maxAge | long | 设置预检请求缓存时间(秒) |
allowCredentials | boolean | 是否允许携带凭据(如 Cookie) |
示例代码
@Configuration
@EnableWebMvc
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("https://example.com")
.allowedMethods("GET", "POST")
.allowedHeaders("Content-Type", "Authorization")
.exposedHeaders("X-Custom-Header")
.maxAge(3600)
.allowCredentials(true);
}
}
如需更细粒度控制,也可以结合 @CrossOrigin
注解在 Controller 或方法级别进行局部配置。