bug【已解决】SpringBoot 项目突然无后端数据:一个隐藏极深的第三方接口过期坑
最近遇到了一个非常离谱的 bug,折腾了整整一下午才解决。现象极其诡异:之前能正常运行的 SpringBoot 项目,突然只有前端界面能打开,所有后端数据都不显示,后端控制台没有任何报错。把完整的排查和解决过程记录下来,给用模板 / 开源项目的同学避坑。
一、bug 现象描述
1.1 核心问题
- 前端页面可以正常打开,静态资源(图片、CSS、JS)全部加载正常
- 所有需要后端接口的地方都没有数据(商品列表、个人中心、公告等全部空白)
- 后端 SpringBoot 项目启动成功,控制台没有任何报错、没有异常堆栈
- 浏览器 F12 查看网络请求:接口返回200 OK,但响应体为空,同时控制台有跨域错误
1.2 诡异点
- 项目一周前还能正常运行,没有修改过任何代码
- 数据库连接正常,手动查询数据库有数据
- 本地和服务器部署的版本同时出现这个问题

二、完整排查过程(踩坑记录)
第一轮:常规后端排查(全部无效)
按照最常见的问题逐一排查:
- 检查数据库连接:确认数据库地址、账号、密码正确,手动执行 SQL 能查到数据
- 检查后端接口:用 Postman 直接调用后端接口,发现所有接口都返回空响应
- 检查日志级别:把日志级别调到 DEBUG,没有发现任何异常
- 重启项目 / 服务器:多次重启,问题依然存在
- 回滚代码:回滚到一周前能正常运行的版本,问题还是存在
✅ 结论:和代码修改、数据库、服务器环境无关,问题出在其他地方。
第二轮:跨域问题排查(找到突破口)
浏览器 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里也藏了时间戳
三、根本原因
这个项目是用的第三方开源模板,模板作者在代码里埋了时间限制,到了指定日期后,自动禁用跨域、接口等核心功能,导致项目看起来正常启动,但实际上所有后端服务都失效了。
这种坑非常隐蔽:
- 没有任何报错提示
- 后端启动完全正常
- 时间戳分散在多个文件里,很难一次性找全
- 不是立刻失效,而是过了几个月才突然出问题
四、解决方案(5 分钟解决)
步骤 1:生成新的时间戳
把时间限制往后推,比如推到 2026 年 10 月 1 日,对应的时间戳是:1790784000000
步骤 2:全局替换所有旧时间戳
用 IDE 的全局替换功能(IDEA 快捷键:Ctrl+Shift+R):
- 查找内容:
1742246400000 - 替换内容:
1790784000000 - 范围:整个项目
- 点击「全部替换」
步骤 3:重启项目
重新编译启动 SpringBoot 项目,所有后端数据立刻恢复正常,跨域问题也解决了。




五、踩坑总结与避坑指南
5.1 这个 bug 的坑点
- 隐蔽性极强:没有任何报错,后端正常启动,很难想到是时间限制
- 分散性:时间戳藏在多个文件里,改一个地方没用
- 滞后性:拿到项目的时候能正常运行,过几个月才突然出问题
5.2 避坑建议
- 拿到模板 / 开源项目第一件事:全局搜索
getTime()、new Date()、时间戳,检查有没有时间限制 - 不要直接用未审计的模板:很多免费模板都会埋这种时间坑,甚至后门
- 跨域配置不要加额外判断:跨域配置应该直接写死,不要加任何条件判断
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 之一,浪费了一下午时间排查数据库、接口、服务器,最后发现是模板作者埋的时间限制。希望这篇博客能帮到遇到同样问题的同学,以后拿到模板项目一定要先检查有没有这种隐藏的坑。
如果这篇文章帮到了你,欢迎点赞收藏~
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)