40. 如何在Spring Boot中处理跨域请求(CORS)?
大约 4 分钟
在Spring Boot中,处理跨域请求(CORS,Cross-Origin Resource Sharing)是一个常见的需求,尤其是在前后端分离的架构中。Spring Boot提供了多种方式来配置和处理CORS,以允许来自不同域的客户端访问你的API。
1. 什么是CORS?
CORS是一种机制,它允许浏览器向不同于提供资源的域(跨域)的服务器发出请求。浏览器通常会限制从不同域加载资源的行为以防止安全问题。通过CORS配置,你可以明确允许哪些域、HTTP方法和请求头访问你的资源。
2. 在Spring Boot中配置CORS
Spring Boot中可以通过以下几种方式来处理CORS:
2.1 使用全局CORS配置
通过在Spring Boot应用的配置类中配置全局CORS策略,可以对所有的控制器和请求路径应用相同的CORS策略。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // 匹配所有路径
.allowedOrigins("https://example.com") // 允许的域
.allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的HTTP方法
.allowedHeaders("*") // 允许的请求头
.allowCredentials(true) // 允许发送Cookie
.maxAge(3600); // 预检请求的缓存时间(秒)
}
}
在这个配置中:
addMapping("/**")
:指定允许跨域的路径模式,这里是所有路径。allowedOrigins("https://example.com")
:指定允许跨域的域名,支持多个域名或使用*
允许所有域名。allowedMethods("GET", "POST", "PUT", "DELETE")
:指定允许的HTTP方法。allowedHeaders("*")
:指定允许的请求头,*
表示允许所有请求头。allowCredentials(true)
:允许携带认证信息(如Cookie)。maxAge(3600)
:设置preflight
请求的缓存时间,单位为秒。
2.2 使用控制器级别的CORS配置
如果你只需要对特定的控制器或方法进行CORS配置,可以直接在控制器或方法上使用@CrossOrigin
注解。
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class MyController {
@CrossOrigin(origins = "https://example.com")
@GetMapping("/resource")
public String getResource() {
return "This is a CORS-enabled resource";
}
}
在这个示例中:
@CrossOrigin(origins = "https://example.com")
:仅允许来自https://example.com
的请求访问这个方法。@CrossOrigin
注解也可以应用在类上,这样整个控制器中的所有方法都会使用相同的CORS配置。
2.3 通过application.properties
配置CORS
在Spring Boot中,可以使用application.properties
或application.yml
文件来配置CORS。这种方式在Spring Security中更加常见,但对于简单的应用可能不如编程方式灵活。
# application.properties
# Spring Security 允许跨域访问的URL
cors.allowed-origins=https://example.com
注意:直接通过application.properties
配置CORS有一定的局限性,通常还是建议使用前述的编程方式来配置。
3. 在Spring Security中配置CORS
如果你的应用使用了Spring Security,你需要在Spring Security的配置中显式地启用CORS支持,否则Spring Security可能会拦截CORS请求。
3.1 在Spring Security配置中启用CORS
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors() // 启用CORS支持
.and()
.csrf().disable() // 如果不需要CSRF保护,可以禁用
.authorizeRequests()
.anyRequest().authenticated();
}
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("https://example.com")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(3600);
}
};
}
}
在这个配置中:
http.cors()
:启用Spring Security对CORS的支持,必须在启用了Spring Security时配置CORS。WebMvcConfigurer
的addCorsMappings
方法用来配置具体的CORS策略。
4. 总结
在Spring Boot中处理跨域请求可以通过多种方式进行配置:
- 全局CORS配置:通过实现
WebMvcConfigurer
接口,并在addCorsMappings
方法中配置CORS策略,适用于整个应用的CORS配置。 - 控制器级别的CORS配置:通过
@CrossOrigin
注解在控制器或方法级别配置CORS,适用于特定控制器或方法的CORS配置。 - Spring Security中的CORS配置:如果你的应用使用了Spring Security,需要在Spring Security的配置中启用CORS支持,并配置CORS策略。
通过这些配置,你可以灵活地控制哪些域可以访问你的API,支持哪些HTTP方法,并处理带有认证信息的跨域请求。