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