Solon CORS配置:跨域请求完整处理
什么是CORS?
CORS(Cross-Origin Resource Sharing,跨域资源共享)是一种基于HTTP头的机制,允许Web应用服务器进行跨域访问控制,从而使跨域数据传输得以安全进行。在现代Web开发中,前后端分离架构已成为主流,CORS配置是每个开发者必须掌握的核心技能。
Solon CORS模块核心组件
Solon提供了完整的CORS解决方案,主要通过以下几个核心组件实现:
| 组件名称 | 类型 | 功能描述 |
|---|---|---|
@CrossOrigin | 注解 | 声明式配置,支持类和方法级别 |
CrossFilter | 过滤器 | 全局或路径模式的CORS处理 |
CrossInterceptor | 拦截器 | 路由级别的CORS拦截处理 |
CrossHandler | 处理器 | 具体的CORS逻辑实现 |
三种配置方式详解
方式一:注解方式(声明式配置)
// 控制器级别配置
@CrossOrigin(origins = "https://example.com", maxAge = 1800, credentials = true)
@Controller
public class UserController {
@Mapping("/api/users")
public List<User> getUsers() {
return userService.findAll();
}
// 方法级别配置(优先级更高)
@CrossOrigin(origins = "*", credentials = false)
@Mapping("/api/public/users")
public List<User> getPublicUsers() {
return userService.findPublicUsers();
}
}
方式二:继承基类配置
// 基类统一配置
@CrossOrigin(origins = "https://api.example.com")
public abstract class BaseApiController {
// 公共业务逻辑
}
// 具体控制器继承配置
@Controller
public class ProductController extends BaseApiController {
@Mapping("/api/products")
public List<Product> getProducts() {
return productService.findAll();
}
}
方式三:全局配置(编程式)
public class App {
public static void main(String[] args) {
Solon.start(App.class, args, app -> {
// 全局CORS配置(最高优先级)
app.filter(-1, new CrossFilter()
.allowedOrigins("https://frontend.example.com")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("Content-Type", "Authorization")
.allowCredentials(true)
.exposedHeaders("X-Custom-Header")
.maxAge(3600));
// 特定路径模式配置
app.filter(new CrossFilter()
.pathPatterns("/api/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST"));
// 使用拦截器方式
app.routerInterceptor(new CrossInterceptor()
.pathPatterns("/admin/**")
.allowedOrigins("https://admin.example.com")
.allowCredentials(true));
});
}
}
CORS配置参数详解
核心配置选项
配置示例表格
| 配置项 | 类型 | 默认值 | 说明 | 示例 |
|---|---|---|---|---|
origins | String | "*" | 允许的源域名 | "https://example.com" |
maxAge | int | 3600 | 预检请求缓存时间(秒) | 1800 |
credentials | boolean | true | 是否允许凭证 | true |
allowedMethods | String | - | 允许的HTTP方法 | "GET,POST,PUT" |
allowedHeaders | String | - | 允许的请求头 | "Content-Type,Authorization" |
exposedHeaders | String | - | 暴露的响应头 | "X-Custom-Header" |
高级配置技巧
环境区分配置
@Configuration
public class CorsConfig {
@Bean
public CrossFilter crossFilter(@Value("${cors.allowed-origins}") String origins) {
return new CrossFilter()
.allowedOrigins(origins)
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowCredentials(true);
}
@Bean
public CrossInterceptor adminCorsInterceptor() {
return new CrossInterceptor()
.pathPatterns("/admin/**")
.allowedOrigins("https://admin.example.com")
.allowedHeaders("X-Admin-Token");
}
}
动态源配置
public class DynamicCorsFilter extends CrossFilter {
private final OriginValidator originValidator;
public DynamicCorsFilter(OriginValidator originValidator) {
this.originValidator = originValidator;
}
@Override
protected boolean isOriginAllowed(String origin) {
return originValidator.isValid(origin);
}
}
// 使用方式
app.filter(-1, new DynamicCorsFilter(originValidator));
常见问题解决方案
1. 预检请求(OPTIONS)处理
// Solon自动处理OPTIONS请求,无需手动配置
@CrossOrigin(origins = "*")
@Controller
public class ApiController {
// 正常的GET、POST等方法,OPTIONS会自动处理
}
2. 凭证(Credentials)与通配符冲突
解决方案:
// 错误配置
@CrossOrigin(origins = "*", credentials = true) // 浏览器会拒绝
// 正确配置
@CrossOrigin(origins = "https://your-domain.com", credentials = true)
3. 多环境配置管理
# application.yml
cors:
allowed-origins:
dev: "http://localhost:3000,http://127.0.0.1:3000"
test: "https://test.example.com"
prod: "https://example.com"
@Bean
@Profile("dev")
public CrossFilter devCorsFilter() {
return new CrossFilter().allowedOrigins("http://localhost:3000", "http://127.0.0.1:3000");
}
@Bean
@Profile("prod")
public CrossFilter prodCorsFilter() {
return new CrossFilter().allowedOrigins("https://example.com");
}
最佳实践建议
安全配置原则
- 最小权限原则:只开放必要的源域名
- 环境隔离:开发、测试、生产环境使用不同的配置
- 定期审查:定期检查CORS配置是否符合当前业务需求
性能优化
// 设置合适的maxAge减少预检请求
new CrossFilter()
.maxAge(86400) // 24小时缓存
.allowedOrigins("https://static.example.com");
监控与日志
public class LoggingCorsFilter extends CrossFilter {
private static final Logger log = LoggerFactory.getLogger(LoggingCorsFilter.class);
@Override
public void doFilter(Context ctx, FilterChain chain) throws Throwable {
String origin = ctx.header("Origin");
log.info("CORS request from origin: {}", origin);
super.doFilter(ctx, chain);
}
}
总结
Solon提供了灵活强大的CORS配置方案,从声明式的注解配置到编程式的全局控制,能够满足各种复杂的跨域场景需求。通过合理的配置策略和最佳实践,可以既保证前端应用的正常访问,又确保后端API的安全性。
记住关键点:
- 使用
@CrossOrigin进行细粒度控制 - 使用
CrossFilter进行全局配置 - 避免
credentials=true与origins="*"同时使用 - 根据环境动态调整配置
- 定期审查和优化CORS策略
通过本文的详细讲解,相信你已经掌握了Solon框架中CORS配置的完整知识体系,能够在实际项目中游刃有余地处理各种跨域场景。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



