一、使用@CrossOrigin注解
@CrossOrigin注解是Spring Boot提供的一个简单而直观的解决方案,它可以直接应用于控制器类或方法上。这种方式适合对特定接口或控制器进行跨域配置。
示例代码
@RestController
@RequestMapping("/api")
public class UserController {
// 允许所有域名跨域访问该方法
@CrossOrigin(origins = "*")
@GetMapping("/getUser")
public User getUser() {
return new User("Alice", 25);
}
// 仅允许特定域名跨域访问
@CrossOrigin(origins = "http://example.com")
@PostMapping("/saveUser")
public void saveUser(@RequestBody User user) {
// 保存用户逻辑
}
}
二、全局配置CORS
如果项目中的所有接口都需要支持跨域,全局配置CORS是一种更优雅的解决方案。我们可以通过实现WebMvcConfigurer接口来完成全局跨域配置。
示例代码
@Configuration
public class GlobalCorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // 允许所有路径的请求
.allowedOrigins("http://example.com") // 允许的来源
.allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的HTTP方法
.allowedHeaders("*") // 允许的请求头
.allowCredentials(true) // 是否允许发送Cookie
.maxAge(3600); // 预检请求的缓存时间(秒)
}
}
三、通过CorsFilter实现跨域
CorsFilter是Spring提供的另一种实现跨域的方式,它通过过滤器来处理跨域请求。这种方式同样可以实现全局跨域配置。
示例代码
@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true); // 是否允许发送Cookie
config.addAllowedOrigin("http://example.com"); // 允许的来源
config.addAllowedHeader("*"); // 允许的请求头
config.addAllowedMethod("*"); // 允许的HTTP方法
source.registerCorsConfiguration("/**", config); // 应用于所有路径
return new CorsFilter(source);
}
}
四、通过自定义过滤器实现跨域
如果需要更灵活的跨域处理逻辑,可以自定义一个过滤器来实现跨域支持。这种方式允许我们在过滤器中编写复杂的逻辑,以满足特定的业务需求。
示例代码
@Component
public class CustomCorsFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse res = (HttpServletResponse) response;
res.addHeader("Access-Control-Allow-Origin", "http://example.com");
res.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
res.addHeader("Access-Control-Allow-Headers", "Content-Type");
res.addHeader("Access-Control-Allow-Credentials", "true");
if ("OPTIONS".equalsIgnoreCase(((HttpServletRequest) request).getMethod())) {
res.setStatus(HttpServletResponse.SC_OK);
} else {
chain.doFilter(request, response);
}
}
}
五、使用Nginx解决跨域问题
除了在Spring Boot中直接处理跨域问题,我们还可以通过Nginx来解决跨域问题。这种方式将跨域处理逻辑从后端代码中分离出来,由Nginx代理完成跨域支持。
示例配置
server {
listen 80;
server_name example.com;
location /api {
proxy_pass http://localhost:8081; // 后端服务地址
add_header 'Access-Control-Allow-Origin' 'http://example.com';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
add_header 'Access-Control-Allow-Headers' 'Content-Type';
add_header 'Access-Control-Allow-Credentials' 'true';
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;
return 204;
}
}
}