peixue-dev/Archive/[一次性]游客模式彻底修复完成-2026-02-01.md

5.8 KiB
Raw Blame History

游客模式彻底修复完成 - 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

修改内容:

// ✅ 如果没有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

操作:

  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应用的最佳实践。