- JwtTokenProvider 新增 validateTokenWithReason 方法,返回具体错误原因 - JwtAuthenticationFilter token 验证失败时返回 401 错误响应 - 前端 axios 拦截器增强 403 处理,区分 token 过期和权限不足场景 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2.1 KiB
2.1 KiB
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 格式的错误响应
- 当 token 验证失败时,不再继续执行
2. 前端修改
文件: reading-platform-frontend/src/api/index.ts
- 增强 403 响应拦截器处理逻辑:
- 区分 token 过期/无效导致的 403 和权限不足的 403
- 当响应体中的错误码为 401 或 403 时,视为 token 问题,清除本地存储并跳转登录页
- 其他情况视为权限不足,仅显示提示但不跳转
修改后的错误处理逻辑:
401 → 清除存储 + 跳转登录页
403 + 错误码 401/403 → 清除存储 + 跳转登录页(token 问题)
403 + 其他错误码 → 显示提示,不跳转(权限不足)
测试验证
后续需要验证以下场景:
- 使用有效 token 正常访问 → 应该成功
- 使用过期 token 访问 → 后端返回 401 + "Token 已过期",前端跳转登录页
- 使用无效 token 访问 → 后端返回 401 + "Token 无效",前端跳转登录页
- 登录时输入错误密码 → 显示具体错误信息