在Spring Boot中解决跨域问题,通常的做法是配置CORS(Cross-Origin Resource Sharing)策略。CORS是一种机制,它使用额外的HTTP头部来告诉浏览器让运行在一个origin(域)上的Web应用被准许访问来自不同源服务器上的指定的资源。
Spring Boot提供了灵活的方式来配置CORS,你可以通过以下几种方式之一来实现:
1. 使用@CrossOrigin
注解
这是最快速的方法,可以直接在Controller类或者Controller的方法上使用@CrossOrigin
注解来允许跨域请求。例如:
@RestController
@CrossOrigin(origins = "http://example.com")
public class MyController {
@GetMapping("/greeting")
public String greeting() {
return "Hello, World!";
}
}
或者,只为特定的方法开启跨域:
@RestController
public class MyController {
@GetMapping("/greeting")
@CrossOrigin(origins = "http://example.com")
public String greeting() {
return "Hello, World!";
}
}
2. 实现WebMvcConfigurer
接口
如果你想要为整个应用配置统一的CORS策略,可以通过实现WebMvcConfigurer
接口并重写addCorsMappings
方法来实现:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://example.com")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.allowCredentials(true);
}
}
这个方法允许你对任何路径(/**
)进行CORS配置,指定允许的源(allowedOrigins
)、方法(allowedMethods
)、头部(allowedHeaders
)以及是否允许发送Cookie(allowCredentials
)。
3. 使用全局CORS配置
Spring Boot 2.x 提供了CorsRegistry
Bean,你可以在全局配置中直接配置CORS策略:
@Configuration
public class GlobalCorsConfig {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://example.com")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.allowCredentials(true);
}
};
}
}
这种方法和实现WebMvcConfigurer
接口相似,但它以Bean的形式提供,便于在需要时注入或替换。
注意事项
- 当你使用
allowedOrigins
时,可以使用*
来允许所有域名,但这在生产环境中可能会带来安全风险。 allowCredentials(true)
允许前端请求携带Cookie,但如果你设置了allowedOrigins
为*
,则这个设置会被忽略,因为出于安全考虑,CORS规范不允许携带凭证的跨域请求对*
源进行响应。- 跨域问题通常涉及前端和后端的协同工作,确保前端的请求头部(如
Access-Control-Allow-Origin
)和后端的响应设置相匹配。