kindergarten_java/docs/dev-logs/2026-03-16.md
En 57f9c804c9 fix: 登录验证错误信息传递修复
- JwtTokenProvider 新增 validateTokenWithReason 方法,返回具体错误原因
- JwtAuthenticationFilter token 验证失败时返回 401 错误响应
- 前端 axios 拦截器增强 403 处理,区分 token 过期和权限不足场景

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 15:26:37 +08:00

2.1 KiB
Raw Blame History

2026-03-16 开发日志

修复内容

登录验证错误信息传递修复

问题描述:

  • 后端的 JwtTokenProvider.validateToken() 方法没有把错误信息返回给前端
  • 前端对 403 错误没有完善处理

修复内容:

1. 后端修改

文件: reading-platform-java/src/main/java/com/reading/platform/common/security/JwtTokenProvider.java

  • 新增 validateTokenWithReason(String token) 方法,返回具体的错误原因:

    • TOKEN_EXPIRED - token 已过期
    • TOKEN_INVALID - token 格式错误或无效
    • TOKEN_UNSUPPORTED - 不支持的 token 格式
    • TOKEN_EMPTY - token 为空
  • 修改原有的 validateToken(String token) 方法,内部调用新方法实现

文件: reading-platform-java/src/main/java/com/reading/platform/common/security/JwtAuthenticationFilter.java

  • 修改 doFilterInternal() 方法:
    • 当 token 验证失败时,不再继续执行 filterChain.doFilter()
    • 直接返回 401 状态码和错误信息
    • 新增 getErrorMessage() 方法,将错误原因转换为用户友好的消息
    • 新增 sendError() 方法,发送 JSON 格式的错误响应

2. 前端修改

文件: reading-platform-frontend/src/api/index.ts

  • 增强 403 响应拦截器处理逻辑:
    • 区分 token 过期/无效导致的 403 和权限不足的 403
    • 当响应体中的错误码为 401 或 403 时,视为 token 问题,清除本地存储并跳转登录页
    • 其他情况视为权限不足,仅显示提示但不跳转

修改后的错误处理逻辑:

401 → 清除存储 + 跳转登录页
403 + 错误码 401/403 → 清除存储 + 跳转登录页token 问题)
403 + 其他错误码 → 显示提示,不跳转(权限不足)

测试验证

后续需要验证以下场景:

  1. 使用有效 token 正常访问 → 应该成功
  2. 使用过期 token 访问 → 后端返回 401 + "Token 已过期",前端跳转登录页
  3. 使用无效 token 访问 → 后端返回 401 + "Token 无效",前端跳转登录页
  4. 登录时输入错误密码 → 显示具体错误信息