3.2 KiB
3.2 KiB
聊天记录加载问题修复总结
问题描述
用户在聊天页面右上角点击聊天记录按钮时,无法正确加载聊天记录。
问题根源分析
通过代码分析发现问题的根本原因:
1. 拦截器配置问题
- WebMvcConfig: 配置了JwtAuthInterceptor,但只拦截
/api/**路径 - WebConfig: 配置了AuthInterceptor和UserContextInterceptor,拦截
/**路径 - MessageController: 路径是
/message,不是/api/message
2. 用户上下文设置问题
- AuthInterceptor: 验证token并将用户信息存储到请求属性中
- UserContextInterceptor: 负责设置UserContextHolder,但没有从请求属性中获取用户信息
- CurrentUserUtil: 从UserContextHolder中获取用户ID,但UserContextHolder中没有正确的用户信息
修复方案
1. 前端错误处理改进
文件: web/src/views/Chat/index.vue
- 在
loadHistoryMessages和searchHistoryMessages方法中添加详细的日志输出 - 改进错误处理,区分不同类型的错误(401认证失败、500服务器错误等)
文件: web/src/services/api.ts
- 改进响应拦截器的错误处理
- 为业务错误码401添加特殊处理
- 增加详细的错误日志输出
2. 后端认证链修复
文件: backend-single/src/main/java/com/emotion/interceptor/AuthInterceptor.java
- 添加从token中获取username并存储到请求属性中
文件: backend-single/src/main/java/com/emotion/interceptor/UserContextInterceptor.java
- 修改
getUserIdFromRequest方法,优先从请求属性中获取用户ID - 修改
getUsernameFromRequest方法,优先从请求属性中获取用户名
3. 后端错误处理改进
文件: backend-single/src/main/java/com/emotion/controller/MessageController.java
- 在所有用户消息相关的API中添加详细的日志输出
- 改进异常处理,区分认证失败和其他错误
- 返回更友好的错误信息
修复后的认证流程
- 请求到达: 用户发送带有Authorization头的请求到
/message/user/page - AuthInterceptor处理:
- 验证JWT token
- 从token中提取userId和username
- 将用户信息存储到请求属性中
- UserContextInterceptor处理:
- 从请求属性中获取用户信息
- 设置到UserContextHolder中
- Controller处理:
- 通过CurrentUserUtil.requireCurrentUserId()获取用户ID
- 查询用户的聊天记录
- 返回结果
测试验证
1. 使用测试工具
- 打开
test-chat-history-api.html - 输入有效的JWT token
- 测试各个API接口
2. 前端测试
- 登录用户账号
- 点击聊天页面右上角的聊天记录按钮
- 检查浏览器控制台的日志输出
- 验证聊天记录是否正确加载
3. 后端日志检查
- 查看后端日志中的用户认证和上下文设置信息
- 确认用户ID正确传递到Controller层
预期结果
- 聊天记录弹窗能够正确打开
- 用户的历史消息能够正确加载和显示
- 搜索功能正常工作
- 分页功能正常工作
注意事项
- 确保前端localStorage中有有效的token
- 确保后端服务正常运行
- 如果仍有问题,检查数据库中是否有用户的消息记录
- 可以使用提供的测试工具进行API级别的调试