Solon CORS配置:跨域请求完整处理

Solon CORS配置:跨域请求完整处理

【免费下载链接】solon 🔥 面向全场景的 Java 企业级应用开发框架:克制、高效、开放、生态!并发高 700%;内存省 50%;启动快 10 倍;打包小 90%;同时兼容 java8 ~ java24。(对标“美国博通公司”(Broadcom)的 Spring 生态) 【免费下载链接】solon 项目地址: https://gitcode.com/opensolon/solon

什么是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配置参数详解

核心配置选项

mermaid

配置示例表格

配置项类型默认值说明示例
originsString"*"允许的源域名"https://example.com"
maxAgeint3600预检请求缓存时间(秒)1800
credentialsbooleantrue是否允许凭证true
allowedMethodsString-允许的HTTP方法"GET,POST,PUT"
allowedHeadersString-允许的请求头"Content-Type,Authorization"
exposedHeadersString-暴露的响应头"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)与通配符冲突

mermaid

解决方案:

// 错误配置
@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");
}

最佳实践建议

安全配置原则

  1. 最小权限原则:只开放必要的源域名
  2. 环境隔离:开发、测试、生产环境使用不同的配置
  3. 定期审查:定期检查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=trueorigins="*"同时使用
  • 根据环境动态调整配置
  • 定期审查和优化CORS策略

通过本文的详细讲解,相信你已经掌握了Solon框架中CORS配置的完整知识体系,能够在实际项目中游刃有余地处理各种跨域场景。

【免费下载链接】solon 🔥 面向全场景的 Java 企业级应用开发框架:克制、高效、开放、生态!并发高 700%;内存省 50%;启动快 10 倍;打包小 90%;同时兼容 java8 ~ java24。(对标“美国博通公司”(Broadcom)的 Spring 生态) 【免费下载链接】solon 项目地址: https://gitcode.com/opensolon/solon

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值