最近遇到了一个非常离谱的 bug,折腾了整整一下午才解决。现象极其诡异:之前能正常运行的 SpringBoot 项目,突然只有前端界面能打开,所有后端数据都不显示,后端控制台没有任何报错。把完整的排查和解决过程记录下来,给用模板 / 开源项目的同学避坑。


一、bug 现象描述

1.1 核心问题

  • 前端页面可以正常打开,静态资源(图片、CSS、JS)全部加载正常
  • 所有需要后端接口的地方都没有数据(商品列表、个人中心、公告等全部空白)
  • 后端 SpringBoot 项目启动成功,控制台没有任何报错、没有异常堆栈
  • 浏览器 F12 查看网络请求:接口返回200 OK,但响应体为空,同时控制台有跨域错误

1.2 诡异点

  • 项目一周前还能正常运行,没有修改过任何代码
  • 数据库连接正常,手动查询数据库有数据
  • 本地和服务器部署的版本同时出现这个问题


二、完整排查过程(踩坑记录)

第一轮:常规后端排查(全部无效)

按照最常见的问题逐一排查:

  1. 检查数据库连接:确认数据库地址、账号、密码正确,手动执行 SQL 能查到数据
  2. 检查后端接口:用 Postman 直接调用后端接口,发现所有接口都返回空响应
  3. 检查日志级别:把日志级别调到 DEBUG,没有发现任何异常
  4. 重启项目 / 服务器:多次重启,问题依然存在
  5. 回滚代码:回滚到一周前能正常运行的版本,问题还是存在

✅ 结论:和代码修改、数据库、服务器环境无关,问题出在其他地方。


第二轮:跨域问题排查(找到突破口)

浏览器 F12 控制台看到跨域错误:

plaintext

Access to XMLHttpRequest at 'http://localhost:8080/api/goods/list' from origin 'http://localhost:8081' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

于是去看项目的跨域配置文件CorsConfig.java,终于发现了问题:

java

运行

@Configuration
public class CorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        
        // 问题就在这里!!
        if(new Date().getTime() < 1742246400000L){
            corsConfiguration.addAllowedOrigin("*");
        }
        
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.setMaxAge(1800L);
        source.registerCorsConfiguration("/**", corsConfiguration);
        return new CorsFilter(source);
    }
}

👉 这里有一个时间戳判断:只有当前时间小于1742246400000的时候,才会开启跨域允许所有来源访问。

把这个时间戳转换成日期:2025 年 3 月 17 日而今天是 2026 年 6 月 4 日,已经远远超过了这个时间!所以跨域配置失效了,前端无法访问后端接口,导致所有数据都不显示。


第三轮:全局搜索,发现更多隐藏的时间戳

本以为改了这一个地方就好了,结果全局搜索这个时间戳,发现整个项目里有 46 处同样的时间戳判断,分布在 9 个文件里

  • 跨域配置CorsConfig.java
  • Swagger 配置SwaggerConfig.java
  • 工具类SessionUtils.java
  • 前端package-lock.json
  • 甚至还有静态资源hot.svg里也藏了时间戳

三、根本原因

这个项目是用的第三方开源模板,模板作者在代码里埋了时间限制,到了指定日期后,自动禁用跨域、接口等核心功能,导致项目看起来正常启动,但实际上所有后端服务都失效了。

这种坑非常隐蔽:

  1. 没有任何报错提示
  2. 后端启动完全正常
  3. 时间戳分散在多个文件里,很难一次性找全
  4. 不是立刻失效,而是过了几个月才突然出问题

四、解决方案(5 分钟解决)

步骤 1:生成新的时间戳

把时间限制往后推,比如推到 2026 年 10 月 1 日,对应的时间戳是:1790784000000

时间戳转换工具:https://tool.chinaz.com/tools/time.aspx

步骤 2:全局替换所有旧时间戳

用 IDE 的全局替换功能(IDEA 快捷键:Ctrl+Shift+R):

  • 查找内容:1742246400000
  • 替换内容:1790784000000
  • 范围:整个项目
  • 点击「全部替换」

步骤 3:重启项目

重新编译启动 SpringBoot 项目,所有后端数据立刻恢复正常,跨域问题也解决了。


五、踩坑总结与避坑指南

5.1 这个 bug 的坑点

  1. 隐蔽性极强:没有任何报错,后端正常启动,很难想到是时间限制
  2. 分散性:时间戳藏在多个文件里,改一个地方没用
  3. 滞后性:拿到项目的时候能正常运行,过几个月才突然出问题

5.2 避坑建议

  1. 拿到模板 / 开源项目第一件事:全局搜索getTime()new Date()、时间戳,检查有没有时间限制
  2. 不要直接用未审计的模板:很多免费模板都会埋这种时间坑,甚至后门
  3. 跨域配置不要加额外判断:跨域配置应该直接写死,不要加任何条件判断

5.3 终极解决方案

直接删除所有时间判断,改成永久生效的跨域配置:

java

运行

@Configuration
public class CorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        // 直接允许所有来源,删除时间判断
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.setMaxAge(1800L);
        source.registerCorsConfiguration("/**", corsConfiguration);
        return new CorsFilter(source);
    }
}

六、写在最后

这个 bug 真的是我遇到过最离谱的 bug 之一,浪费了一下午时间排查数据库、接口、服务器,最后发现是模板作者埋的时间限制。希望这篇博客能帮到遇到同样问题的同学,以后拿到模板项目一定要先检查有没有这种隐藏的坑。

如果这篇文章帮到了你,欢迎点赞收藏~

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐