3.6 KiB
3.6 KiB
验证码404问题修复工作记录
时间: 2025年1月16日
版本: 0.2.1 → 0.2.2
问题: 前端管理界面登录验证码图片显示404错误
问题分析
根本原因
Spring Boot主启动类QuapApplication的包扫描配置中缺少了com.qaup.web包,导致CaptchaController验证码控制器未被扫描注册。
错误表现
- 前端登录页面验证码显示"系统接口 404 异常"
- 后端接口
/captchaImage返回404 Not Found - 通过
/actuator/mappings确认验证码接口未注册
技术分析
CaptchaController位于com.qaup.web.controller.common包@ComponentScan配置中遗漏了com.qaup.web包- 验证码相关依赖配置完整(kaptcha 2.3.3)
修复过程
1. WebSocket并发问题修复
在解决验证码问题的同时,发现并修复了WebSocket并发问题:
- 问题: 多线程同时发送WebSocket消息导致
TEXT_PARTIAL_WRITING状态错误 - 解决: 在
CollisionWebSocketHandler.sendMessage()方法中添加synchronized (session)锁
// 添加同步锁确保同一个会话的消息发送是串行的
synchronized (session) {
if (session.isOpen()) { // 再次检查状态
session.sendMessage(new TextMessage(message));
}
}
2. 包扫描配置修复
修改QuapApplication.java中的@ComponentScan配置:
@ComponentScan(basePackages = {
"com.qaup.system",
"com.qaup.framework",
"com.qaup.common",
"com.qaup.quartz",
"com.qaup.generator",
"com.qaup.collision",
"com.qaup.websocket",
"com.qaup.web" // 新增:扫描web包(包含验证码控制器)
})
3. 前端环境变量配置
修复了前端Vue项目缺少环境变量配置的问题:
在vue.config.js中添加环境变量默认值:
// 设置环境变量默认值
process.env.VUE_APP_BASE_API = process.env.VUE_APP_BASE_API || '/dev-api'
process.env.VUE_APP_TITLE = process.env.VUE_APP_TITLE || 'QAUP机场预警管理系统'
验证结果
后端验证
curl -X GET "http://localhost:8080/captchaImage" -H "Accept: application/json"
返回结果:
{
"msg": "操作成功",
"img": "/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsL...",
"code": 200,
"captchaEnabled": true,
"uuid": "ec415fe0b23945e1bc7b84bd49cdfa24"
}
服务状态
- 后端服务: http://localhost:8080 ✅
- 前端服务: http://localhost:1025 ✅
- 验证码接口:
/captchaImage✅
技术要点
验证码组件配置
- 使用kaptcha 2.3.3生成验证码
- 支持数学运算和字符两种类型
- 配置在
CaptchaConfig中,默认数学运算类型 - 验证码有效期通过Redis管理
Spring Boot包扫描
@ComponentScan默认只扫描主类所在包及子包- 跨包组件需要显式配置包扫描路径
- 确保所有业务模块的控制器都被包含
WebSocket线程安全
- 同一WebSocket会话的消息发送必须串行化
- 使用
synchronized确保线程安全 - 双重检查会话状态避免异常
解决的问题
- ✅ 验证码图片404错误 → 正常显示验证码
- ✅ WebSocket并发异常 → 线程安全发送
- ✅ 前端环境变量缺失 → 默认值配置
- ✅ 包扫描配置不全 → 完整包扫描
注意事项
- 服务重启后验证码功能正常
- WebSocket消息广播性能有轻微影响(加锁)
- 前端代理配置确保API请求正确转发
- 确保Redis服务运行(验证码存储依赖)
后续建议
- 监控WebSocket消息发送性能影响
- 考虑使用消息队列优化高并发场景
- 完善前端错误处理和用户提示
- 添加验证码接口的健康检查