Files
happy-life-star/chat-history-fix-summary.md
T
2025-07-25 17:48:02 +08:00

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

  • loadHistoryMessagessearchHistoryMessages方法中添加详细的日志输出
  • 改进错误处理,区分不同类型的错误(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中添加详细的日志输出
  • 改进异常处理,区分认证失败和其他错误
  • 返回更友好的错误信息

修复后的认证流程

  1. 请求到达: 用户发送带有Authorization头的请求到/message/user/page
  2. AuthInterceptor处理:
    • 验证JWT token
    • 从token中提取userId和username
    • 将用户信息存储到请求属性中
  3. UserContextInterceptor处理:
    • 从请求属性中获取用户信息
    • 设置到UserContextHolder中
  4. Controller处理:
    • 通过CurrentUserUtil.requireCurrentUserId()获取用户ID
    • 查询用户的聊天记录
    • 返回结果

测试验证

1. 使用测试工具

  • 打开test-chat-history-api.html
  • 输入有效的JWT token
  • 测试各个API接口

2. 前端测试

  • 登录用户账号
  • 点击聊天页面右上角的聊天记录按钮
  • 检查浏览器控制台的日志输出
  • 验证聊天记录是否正确加载

3. 后端日志检查

  • 查看后端日志中的用户认证和上下文设置信息
  • 确认用户ID正确传递到Controller层

预期结果

  • 聊天记录弹窗能够正确打开
  • 用户的历史消息能够正确加载和显示
  • 搜索功能正常工作
  • 分页功能正常工作

注意事项

  1. 确保前端localStorage中有有效的token
  2. 确保后端服务正常运行
  3. 如果仍有问题,检查数据库中是否有用户的消息记录
  4. 可以使用提供的测试工具进行API级别的调试