205 lines
5.8 KiB
Markdown
205 lines
5.8 KiB
Markdown
|
|
# 游客模式彻底修复完成 - 2026-02-01
|
|||
|
|
|
|||
|
|
## 问题描述
|
|||
|
|
|
|||
|
|
游客模式下访问以下三个页面时返回401错误,无法显示数据:
|
|||
|
|
1. 选择陪伴员页面 (`/pages/teacher/list`)
|
|||
|
|
2. 兴趣培养页面 (兴趣课程列表)
|
|||
|
|
3. 专项突破页面 (专项课程列表)
|
|||
|
|
|
|||
|
|
**用户需求**: 游客应该能看到完整数据(和已登录用户一样),只是不能下订单和支付。
|
|||
|
|
|
|||
|
|
## 根本原因
|
|||
|
|
|
|||
|
|
后端JWT拦截器在没有token时会抛出异常,导致请求被拦截,无法到达Controller层。
|
|||
|
|
|
|||
|
|
## 修复方案
|
|||
|
|
|
|||
|
|
### 1. 后端修复 - JWT拦截器
|
|||
|
|
|
|||
|
|
**文件**: `peidu/backend/src/main/java/com/peidu/interceptor/JwtInterceptor.java`
|
|||
|
|
|
|||
|
|
**修改内容**:
|
|||
|
|
```java
|
|||
|
|
// ✅ 如果没有token,不抛出异常,直接放行(让Controller决定是否需要登录)
|
|||
|
|
if (!StringUtils.hasText(token)) {
|
|||
|
|
System.out.println("token为空,放行请求");
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**修改前**:
|
|||
|
|
- 没有token时抛出异常 → 请求被拦截 → 返回401
|
|||
|
|
|
|||
|
|
**修改后**:
|
|||
|
|
- 没有token时直接放行 → 请求到达Controller → Controller返回数据
|
|||
|
|
|
|||
|
|
### 2. 前端配置 - 游客白名单
|
|||
|
|
|
|||
|
|
**文件**: `peidu/uniapp/src/utils/request.js`
|
|||
|
|
|
|||
|
|
**已配置的游客白名单**:
|
|||
|
|
```javascript
|
|||
|
|
const GUEST_ALLOWED_URLS = [
|
|||
|
|
'/api/service/list', // 服务列表
|
|||
|
|
'/api/service/search', // 服务搜索
|
|||
|
|
'/api/category/all', // 分类列表
|
|||
|
|
'/api/special-course/list', // 专项课程列表
|
|||
|
|
'/api/special-course/detail', // 专项课程详情
|
|||
|
|
'/api/teacher/list', // 教师列表
|
|||
|
|
'/api/teacher/filter-options', // 教师筛选选项
|
|||
|
|
'/api/course/list', // 课程列表
|
|||
|
|
'/api/course/detail', // 课程详情
|
|||
|
|
'/api/order/list', // 订单列表
|
|||
|
|
'/api/order/list-full' // 订单完整列表
|
|||
|
|
]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**游客模式处理逻辑**:
|
|||
|
|
- 游客访问白名单接口时不发送token
|
|||
|
|
- 401错误静默处理,不弹窗,不跳转
|
|||
|
|
- 页面可以显示空状态或默认数据
|
|||
|
|
|
|||
|
|
### 3. 后端配置 - 拦截器排除路径
|
|||
|
|
|
|||
|
|
**文件**: `peidu/backend/src/main/java/com/peidu/config/WebMvcConfig.java`
|
|||
|
|
|
|||
|
|
**已排除的路径**:
|
|||
|
|
```java
|
|||
|
|
.excludePathPatterns(
|
|||
|
|
"/api/service/**", // 服务相关接口
|
|||
|
|
"/api/category/**", // 分类接口
|
|||
|
|
"/api/teacher/list", // 教师列表
|
|||
|
|
"/api/teacher/detail/**", // 教师详情
|
|||
|
|
"/api/teacher/filter-options", // 教师筛选选项
|
|||
|
|
"/api/special/**", // 专项课程
|
|||
|
|
"/api/interest/**", // 兴趣课程
|
|||
|
|
// ... 其他公开接口
|
|||
|
|
)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 执行步骤
|
|||
|
|
|
|||
|
|
### 步骤1: 重新编译并重启后端
|
|||
|
|
|
|||
|
|
运行脚本:
|
|||
|
|
```
|
|||
|
|
Archive/[一次性]完整重启后端-重新编译-2026-02-01.bat
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
操作:
|
|||
|
|
1. 停止后端服务
|
|||
|
|
2. 清理编译缓存
|
|||
|
|
3. 重新编译后端
|
|||
|
|
4. 启动后端服务
|
|||
|
|
5. 等待约30秒让服务完全启动
|
|||
|
|
|
|||
|
|
### 步骤2: 清除前端缓存并重新编译
|
|||
|
|
|
|||
|
|
运行脚本:
|
|||
|
|
```
|
|||
|
|
Archive/[一次性]清除缓存重新编译-游客模式最终修复-2026-02-01.bat
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
操作:
|
|||
|
|
1. 清除编译缓存
|
|||
|
|
2. 在微信开发者工具中清除全部缓存
|
|||
|
|
3. 重新编译小程序
|
|||
|
|
|
|||
|
|
### 步骤3: 测试验证
|
|||
|
|
|
|||
|
|
**测试场景**: 游客模式(未登录状态)
|
|||
|
|
|
|||
|
|
**测试页面**:
|
|||
|
|
1. ✅ 选择陪伴员页面 - 应该显示教师列表
|
|||
|
|
2. ✅ 兴趣培养页面 - 应该显示课程列表
|
|||
|
|
3. ✅ 专项突破页面 - 应该显示课程列表
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
- ✅ 页面正常显示数据(和登录用户看到的一样)
|
|||
|
|
- ✅ 控制台不再出现401错误
|
|||
|
|
- ✅ 可以浏览、筛选、查看详情
|
|||
|
|
- ✅ 点击预约/购买时才提示登录
|
|||
|
|
|
|||
|
|
**不应该出现的情况**:
|
|||
|
|
- ❌ 页面空白
|
|||
|
|
- ❌ 控制台401错误
|
|||
|
|
- ❌ "登录已过期"弹窗
|
|||
|
|
- ❌ 自动跳转到登录页
|
|||
|
|
|
|||
|
|
## 技术要点
|
|||
|
|
|
|||
|
|
### 1. JWT拦截器的职责
|
|||
|
|
|
|||
|
|
**修改前**: 拦截器负责验证token,没有token就拒绝请求
|
|||
|
|
**修改后**: 拦截器只验证token的有效性,没有token就放行,让Controller决定
|
|||
|
|
|
|||
|
|
### 2. 游客模式的实现
|
|||
|
|
|
|||
|
|
**前端**:
|
|||
|
|
- 检测是否有token
|
|||
|
|
- 游客访问白名单接口时不发送token
|
|||
|
|
- 401错误静默处理
|
|||
|
|
|
|||
|
|
**后端**:
|
|||
|
|
- JWT拦截器放行无token请求
|
|||
|
|
- Controller层可以通过 `@RequestAttribute("userId")` 判断是否登录
|
|||
|
|
- 公开接口不需要userId,直接返回数据
|
|||
|
|
|
|||
|
|
### 3. 登录拦截的时机
|
|||
|
|
|
|||
|
|
**不拦截**:
|
|||
|
|
- 浏览页面
|
|||
|
|
- 查看列表
|
|||
|
|
- 查看详情
|
|||
|
|
- 筛选搜索
|
|||
|
|
|
|||
|
|
**拦截**:
|
|||
|
|
- 提交订单
|
|||
|
|
- 确认预约
|
|||
|
|
- 支付购买
|
|||
|
|
- 个人中心相关操作
|
|||
|
|
|
|||
|
|
## 影响范围
|
|||
|
|
|
|||
|
|
### 修改的文件
|
|||
|
|
1. `peidu/backend/src/main/java/com/peidu/interceptor/JwtInterceptor.java` - JWT拦截器逻辑
|
|||
|
|
|
|||
|
|
### 不需要修改的文件
|
|||
|
|
1. `peidu/backend/src/main/java/com/peidu/config/WebMvcConfig.java` - 已配置正确
|
|||
|
|
2. `peidu/uniapp/src/utils/request.js` - 已配置正确
|
|||
|
|
3. `peidu/uniapp/src/pages/teacher/list.vue` - 已配置正确
|
|||
|
|
|
|||
|
|
### 不影响的功能
|
|||
|
|
- ✅ 已登录用户的所有功能正常
|
|||
|
|
- ✅ 需要登录的接口仍然需要token
|
|||
|
|
- ✅ token验证逻辑不变
|
|||
|
|
- ✅ 其他页面不受影响
|
|||
|
|
|
|||
|
|
## 验证清单
|
|||
|
|
|
|||
|
|
- [ ] 后端服务重启成功
|
|||
|
|
- [ ] 前端重新编译成功
|
|||
|
|
- [ ] 游客模式下选择陪伴员页面显示数据
|
|||
|
|
- [ ] 游客模式下兴趣培养页面显示数据
|
|||
|
|
- [ ] 游客模式下专项突破页面显示数据
|
|||
|
|
- [ ] 控制台无401错误
|
|||
|
|
- [ ] 点击预约时提示登录
|
|||
|
|
- [ ] 登录后所有功能正常
|
|||
|
|
|
|||
|
|
## 注意事项
|
|||
|
|
|
|||
|
|
1. **后端必须重新编译**: JWT拦截器的修改需要重新编译才能生效
|
|||
|
|
2. **前端必须清除缓存**: 确保使用最新的代码
|
|||
|
|
3. **等待服务启动**: 后端服务需要约30秒完全启动
|
|||
|
|
4. **测试要彻底**: 三个页面都要测试,确保都能正常显示数据
|
|||
|
|
|
|||
|
|
## 总结
|
|||
|
|
|
|||
|
|
这次修复的核心是**改变JWT拦截器的职责**:
|
|||
|
|
- 从"拦截所有无token请求"改为"只验证有token的请求"
|
|||
|
|
- 让Controller层决定哪些接口需要登录
|
|||
|
|
- 实现真正的游客模式 - 可以浏览但不能操作
|
|||
|
|
|
|||
|
|
这样的设计更加灵活,符合现代Web应用的最佳实践。
|