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

56 lines
2.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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. 登录时输入错误密码 → 显示具体错误信息