应将跨域白名单定义为static final不可变集合(如set.of()),仅作配置载体,需在spring corsconfiguration或webmvcconfigurer中显式引用;禁止硬编码通配符,推荐通过@value注入环境化配置,并注意热部署下classloader隔离问题。

在工具类中用 static 关键字定义跨域白名单,本质是利用类加载时初始化的静态字段来集中管理可信任源,但需注意:它只是配置数据的载体,真正起作用的是框架(如 Spring)的跨域配置逻辑,static 本身不提供安全防护。
白名单应定义为 static final 集合
避免运行时被意外修改,推荐使用不可变集合。例如在工具类中声明:
(Spring Boot 环境下示例)
- 用
static final Set<string></string>存储域名,如"https://a.example.com"、"http://localhost:8080" - 使用
Set.of()(Java 9+)或Collections.unmodifiableSet()封装,防止外部 add/remove - 不建议存通配符(如
"*"),除非明确接受任意源——这会削弱安全性
将白名单接入 Spring 的 CorsConfiguration
静态字段需被实际用于构建 CORS 配置,否则只是“死数据”。常见做法:
- 在
@Configuration类中,通过CorsConfiguration手动设置setAllowedOrigins(YourUtil.ALLOWED_ORIGINS) - 或在
WebMvcConfigurer的addCorsMappings方法中引用该集合 - 若用 Spring Security,需在
HttpSecurity.cors()配置中关联同一白名单源
区分开发与生产环境的白名单
静态字段无法自动适配环境,硬编码会导致风险。稳妥做法:
- 白名单不写死在代码里,而是从
@Value("${cors.allowed-origins}")注入,工具类中仅提供解析和校验逻辑 - 若坚持用
static,至少按 profile 分离:用static块配合SpringProfiles或Environment动态赋值 - 本地开发可保留
localhost,生产环境必须严格限定已备案域名
注意 static 字段的生命周期与线程安全
静态变量随类加载而初始化,多线程访问无问题(因只读),但有两点易忽略:
- 若白名单后期需刷新(如运营后台动态维护),
static final无法更新,应改用线程安全的容器(如ConcurrentHashMap)并配合事件监听 - 确保工具类不被多个 ClassLoader 加载(如热部署场景),否则可能产生多份白名单副本











