SpringMVC 配置跨域(CORS)
# SpringMVC 配置跨域(CORS)
前言
在构建现代Web应用时,前后端分离架构常常需要处理跨域请求问题。Spring MVC 提供了灵活的方式来配置跨域资源共享(CORS),可以通过 WebMvcConfigurer
接口的 addCorsMappings
方法进行配置。同时,为了解决跨域配置可能失效的问题,通常还需要结合自定义过滤器来确保跨域设置生效。
# 1. 使用 addCorsMappings
配置 CORS
在 Spring MVC 中,最常见的跨域配置方式是通过实现 WebMvcConfigurer
接口并重写 addCorsMappings
方法:
@Configuration
public class MyWebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
// 配置跨域请求处理的规则
registry.addMapping("/**") // 对所有路径应用 CORS 规则
.allowedOrigins("*") // 允许所有来源的请求
.allowedHeaders("*") // 允许所有请求头
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 允许的 HTTP 请求方法
.allowCredentials(true) // 允许发送 Cookie 信息
.maxAge(3600); // 预检请求的缓存时间为 3600 秒(1 小时)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
关键配置参数:
addMapping("/**")
:指定哪些路径需要进行跨域配置。"/**"
表示应用于所有路径。allowedOrigins("*")
:允许的请求来源,"*"
表示允许所有来源。如果你需要限制来源,可以将其设置为指定的域名列表。allowedHeaders("*")
:允许的请求头,"*"
表示接受所有请求头。如果你需要限制某些请求头,可以指定具体的头部信息。allowedMethods("GET", "POST", ...)
:允许的请求方法,例如 GET、POST、PUT 等。allowCredentials(true)
:是否允许发送凭证(如 Cookies、HTTP 认证信息等)。设置为true
时,allowedOrigins
不应为*
,而应该指定具体的域名。maxAge(3600)
:预检请求的缓存时间,单位为秒。浏览器会在指定时间内缓存预检请求的结果,从而避免每次发送跨域请求时都执行预检请求。
# 2. 处理跨域配置失效问题
在一些场景下,使用 addCorsMappings
进行跨域配置可能会失效,特别是在使用自定义拦截器的情况下。其原因是请求在进入跨域处理器之前可能被其他拦截器拦截,从而导致跨域响应头未被正确设置。
解决方案:
为了确保跨域配置始终生效,可以使用过滤器设置跨域允许信息。过滤器会在拦截器之前执行,因此无论拦截器如何处理请求,跨域设置都会生效。
@Bean
public FilterRegistrationBean<CorsFilter> corsFilter() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Arrays.asList("*")); // 允许所有来源
configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS")); // 允许的请求方法
configuration.setAllowedHeaders(Arrays.asList("*")); // 允许所有请求头
configuration.setAllowCredentials(true); // 允许发送凭证
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration); // 应用到所有路径
FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source));
bean.setOrder(Ordered.HIGHEST_PRECEDENCE); // 设置过滤器的执行顺序为最高优先级
return bean;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
关键配置说明:
CorsConfiguration
:用于定义跨域规则,包括允许的来源、请求方法、请求头等。UrlBasedCorsConfigurationSource
:根据 URL 路径配置跨域规则。FilterRegistrationBean<CorsFilter>
:注册跨域过滤器并设置其执行顺序为最高优先级,确保它在其他过滤器之前执行。
# 3. CORS 配置的注意事项
- 预检请求(OPTIONS):跨域请求中,浏览器会先发送一个 OPTIONS 请求作为预检请求,以确定服务器是否允许实际请求。这种请求不会携带实际数据,但必须通过 CORS 验证。
allowCredentials(true)
与allowedOrigins("*")
的冲突:如果设置了allowCredentials(true)
,allowedOrigins
不应为"*"
,而应该指定具体的域名,否则会导致浏览器拒绝请求。- 过滤器的优先级:跨域过滤器的优先级应设置为最高,以避免后续拦截器或过滤器在返回响应之前影响跨域设置。
# 4. 适用场景
- 单点登录(SSO)系统:跨域共享认证信息和凭证。
- 前后端分离架构:不同域名、端口之间的数据交互。
- 第三方 API 集成:允许其他系统通过 CORS 访问你的服务。
通过以上配置,Spring MVC 能够灵活应对跨域请求,确保前端和后端在不同域之间的数据交换顺畅进行,同时保持良好的安全性。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08