uniapp 中使用路由导航守卫,进行登录鉴权

前言:

在uniapp 使用中,对于登录界面可能需要路由守卫进行方便判断跳转,以下有两种方案,可以判断用户跳转的时候是否是登录状态

方案一:

1. 可以使用插件 hh-router-guard
  1. 使用 uni-simpe-route

方案二: 使用通过uni提供的拦截器实现, uni.addInterceptor

1.新建interceptor.js
javascript 复制代码
// ====================== 全局路由拦截器 ======================
// 功能:统一管理路由拦截逻辑(仅使用白名单模式)
// 使用:在 App.vue 的 onLaunch 中调用 initRouteGuard()

// 1. 核心配置(支持动态更新)
const routeConfig = {
  // 白名单:完全开放的页面路径
  whiteList: new Set([
    '/modules/login/index',
    '/pages/error/404'
  ]),
  // 动态扩展名单(可从接口加载)
  dynamicList: new Set()
};

// 2. 权限校验逻辑
function checkPermission(url) {
  const path = url.split('?')[0];
  console.log('path', path)
  // 白名单校验
  if (routeConfig.whiteList.has(path)) {
    console.log('放行白名单')
    return true; // 放行白名单页面
  }
  // 默认拦截非白名单页面,跳转到登录页
  //!! 如果tokne存在且有效,返回true ,否则返回fasle 
  const token = uni.getStorageSync('token');
  console.log('token', token)
  return !!uni.getStorageSync('token'); // 检查登录状态
}

// 3. 拦截器核心方法
const routeInterceptor = {
  invoke(args) {
    console.log('启用拦截器', args);
    if (checkPermission(args.url)) return true;
    // 未登录跳转登录页(携带来源路径)
    uni.redirectTo({
      url: `/modules/login/index?redirect=${encodeURIComponent(args.url)}`
    });
    return false; // 阻断原始跳转
  }
};

// 4. 初始化方法(暴露给外部调用)
export function initRouteGuard() {
  // 注册拦截器(覆盖主要路由方法)
  uni.addInterceptor('navigateTo', routeInterceptor);
  uni.addInterceptor('redirectTo', routeInterceptor);
  uni.addInterceptor('reLaunch', routeInterceptor);

  console.log('[路由守卫] 已启动');
}

// 5. 动态更新白名单方法
export function updateRouteConfig(paths, isReset = false) {
  // 如果需要重置白名单,先清空
  if (isReset) routeConfig.whiteList.clear();
  // 添加新的路径到白名单
  paths.forEach(path => routeConfig.whiteList.add(path));
  console.log(`[路由守卫] 已更新白名单:${paths.join(', ')}`);
}
// 6. 扩展:角色权限校验(可选)
export function checkUserRole(requiredRole) {
  const userRole = uni.getStorageSync('userRole') || 'guest';
  return userRole === requiredRole;
}
  1. 在app.vue onLaunch中调用 initRouteGuard(); // 启动拦截器
相关推荐
lichenyang4532 分钟前
从 Express 老项目到 NestJS + Docker:一次车辆管理系统的渐进式重构
前端
Momo__1 小时前
VueUse createReusableTemplate —— 单文件组件内的模板复用神器
前端·vue.js
程序员小富1 小时前
我开源了一个开发者专属的智能 JSON 工具,得到了媳妇高度认可
前端·vue.js·后端
小小小小宇1 小时前
程序员如何给 LLM 装工具以及看懂推理过程
前端
写代码的皮筏艇1 小时前
React中的forwardRef
前端·react.js·面试
槑有老呆2 小时前
花三个月工资请了个 AI 程序员,结果它连青岛啤酒股价都查不了
前端
风骏时光牛马2 小时前
Verilog开发常见问题汇总解析
前端
子兮曰2 小时前
AI Coding Method Map:一张图看懂 AI 编程的完整链路
前端·人工智能·后端
weedsfly2 小时前
语法糖褪去之后——Babel 转译产物中的 JavaScript 本貌
前端·javascript