在现代的Web开发中,前后端分离的架构变得越来越流行。前端应用通常会运行在不同的域名或端口上,而后端API则可能部署在另一台服务器上。这种情况下,就会涉及到跨域资源共享(CORS)的问题。Spring Boot作为一个流行的Java开发框架,提供了一系列的解决方案来处理CORS问题。本文将详细介绍Spring Boot 3中的跨域方案,以及如何轻松告别CORS的烦恼。
什么是CORS
CORS(跨域资源共享)是一种机制,允许浏览器向不同于所请求资源的域发送HTTP请求。这样一来,前端可以安全地请求后端API而不必担心安全问题。浏览器在跨域请求时,会做一些限制,必须通过设置相应的HTTP头(如Access-Control-Allow-Origin
)来允许跨域访问。
Spring Boot 3中的CORS解决方案
在Spring Boot 3中,我们可以通过几种方式来配置CORS。
1. 使用@CrossOrigin注解
这是最简单的方式,只需在Controller类或方法上添加@CrossOrigin
注解。例如:
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@CrossOrigin(origins = "http://localhost:3000") // 允许来自指定源的请求
public class MyController {
@GetMapping("/api/data")
public String getData() {
return "Hello from the backend!";
}
}
在这个示例中,我们允许来自http://localhost:3000
的请求访问/api/data
接口。你也可以使用allowedHeaders
、allowedMethods
等参数来进一步配置CORS策略。
2. 全局CORS配置
如果需要全局配置CORS,可以创建一个实现WebMvcConfigurer
接口的配置类。这样可以避免在每个Controller上都添加注解。示例如下:
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("http://localhost:3000") // 允许的源
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 允许的请求方法
.allowCredentials(true) // 允许携带凭证
.maxAge(3600); // 预检请求的有效期
}
}
在这个配置中,我们允许从http://localhost:3000
源发出的所有请求,这对API的统一管理非常有用。
3. 使用Filter方式
除了使用注解或全局配置外,我们还可以通过定义一个Filter来处理CORS。这种方式适合需要复杂处理逻辑的场景。
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CustomCORSFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "http://localhost:3000");
response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
response.setHeader("Access-Control-Allow-Headers", "Origin, Content-Type, Accept");
response.setHeader("Access-Control-Allow-Credentials", "true");
chain.doFilter(req, res);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException { }
@Override
public void destroy() { }
}
然后在@Configuration
类中注册这个Filter:
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<CustomCORSFilter> corsFilter() {
FilterRegistrationBean<CustomCORSFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new CustomCORSFilter());
registrationBean.addUrlPatterns("/*");
return registrationBean;
}
}
总结
以上介绍了Spring Boot 3中处理CORS的几种方式,包括使用@CrossOrigin
注解、全局配置和自定义Filter。根据项目需求,你可以选择最适合的方案来实现CORS。通过合理的CORS配置,你可以轻松地告别CORS带来的烦恼,为你的前后端分离架构提供良好的支持。希望这些示例和讲解能帮助你更好地理解和应对跨域问题。