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