Vue Router 跳转404,路由守卫及配置(登录篇)

2023-11-14

在这个前端技术迭代迅速的时代,单页面应用开发中,路由守卫已经是非常常见也是必备的需求,为了控制使用者在各种状态下的路由页面跳转,例如:是否登录是否有路由权限等等,今天就记录一下在各种登录状态下路由配置和路由守卫。

Vue Router官方文档:https://router.vuejs.org/zh/guide/advanced/navigation-guards.html

页面跳转场景:

各登录状态下跳转场景大概可分为以下几种

  • 跳转非登录页
  • 跳转登录页
  • 跳转根路由
  • 跳转未定义路由

解决方案:

1. 跳转非登录页

router.beforeEach(前置守卫)中判断目标路由是否需要登录,需要登录则重定向到登录页,对于无需登录的如:404注册重置密码 等页面,直接进入 next() 即可,不做处理。

// 路由前置守卫
router.beforeEach((to, from, next) => {
  const { meta, name } = to;
  const { isLogin } = meta;
  // token不存在时跳转非登录页,重定向到登录页
  if (!getToken() && name !== 'Login' && isLogin) next({ path: '/login' });
  // 其他场景
  else next();
});
2. 跳转登录页

router.beforeEach(前置守卫) 中判断,已登录时重定向到首页,未登录时理所应当到登录页,所以不做处理,直接进 next()

// 路由前置守卫
router.beforeEach(({ meta, name }, from, next) => {
  const { title, isLogin } = meta;
  if (title) document.title = title;
  
  // token不存在时跳转非登录页,重定向到登录页
  if (!getToken() && name !== 'Login' && isLogin) next({ path: '/login' });
  // token存在时跳转登录页,重定向到首页
  else if (getToken() && name === 'Login') next({ path: '/home' });
  // 其他场景
  else next();
});
3. 跳转根路由

丢失路由路径的情况很常见,比如得到一个链接 http://localhost:8080/#/如果未定义根路由渲染组件,那么此链接跳转后,会得到异常的空白页面,这要是上了生产,怕是要GG~,但如果你的 / 是像下面这样配置的,虽然不会出现访问根路由空白问题,但也需要兼容未登录时的登录页重定向。

const routes = [
  {
    path: '/',
    name: 'Home',
    meta: {
      title: 'Homepage',
      isLogin: true
    },
    component: () => import('@/views/Home')
  }
];

你还可以通过设置别名的方式来规避根路由空白的问题:
https://next.router.vuejs.org/zh/guide/essentials/redirect-and-alias.html

const routes = [{ path: '/', component: Homepage, alias: '/home' }]

正常情况下访问根路由,要么跳转登录页,要么跳转首页,所以,我们需要进行以下配置:

当你的根路由 / 未进行路由组件配置时,你需要定义访问 / 路径,重定向到 /home 或者 /login 路径,下列代码结合我们第一,第二点配置的路由前置守卫,可以分别适配两种跳转场景,未登录时访问 / 跳转到 /login,已登录时访问 / 跳转到 /home

const routes = [
  {
    path: '/',
    redirect: '/home'
  },
  {
    path: '/home',
    name: 'Home',
    meta: {
      title: 'Homepage',
      isLogin: true
    },
    component: () => import('@/views/Home')
  },
  {
    path: '/login',
    name: 'Login',
    meta: {
      title: 'Login Page'
    },
    component: () => import('@/views/Home')
  }
];
4. 跳转未定义路由

网页链接在Copy N次的过程中,可能出现丢失路径,或者多加了一段路径的情况,比如 http://localhost:8080/#/mmp~ 然后被测试同学或者客户碰巧用上了,他们打开之后就会发现出现空白页面,还有你就会发现你的bug清单上多了一项,出现这种情况的原因很简单,你没有配置对应的路由渲染组件,所以为了规避这种异常状况,通常我们要配置一个 /404 的路由页面,然后使用通配符路由 * 来重定向到 /404/ 页面。

配置方法如下:

const routes = [
  {
    path: '/',
    redirect: '/home'
  },
  {
    path: '/404',
    name: 'NotFound',
    meta: {
      title: 'Page not found',
      isLogin: false
    },
    component: () => import('@/views/NotFound')
  },
  // 所有未定义路由,全部重定向到404页
  {
    path: '*',
    redirect: '/404'
  }
];

所有未定义的路径都将匹配 * 这个路由定义,然后重定向到 /404,例如:

  • http://localhost:8080/#/jjyy => http://localhost:8080/#/404
  • http://localhost:8080/#/mmp => http://localhost:8080/#/404

据说 * 必须放在最后定义,不过我不放在最后好像也能跑?(??手动黑人问号??)

router / index.js 代码:
import Vue from 'vue';
import VueRouter from 'vue-router';

import { getToken } from '@/utils/cookies';

Vue.use(VueRouter);

const routes = [
  {
    path: '/',
    redirect: '/home'
  },
  {
    path: '/home',
    name: 'Home',
    meta: {
      title: 'Home',
      isLogin: true
    },
    component: () => import('@/views/Home')
  },
  {
    path: '/login',
    name: 'Login',
    meta: {
      title: 'Login'
    },
    component: () => import('@/views/Login')
  },
  {
    path: '/404',
    name: 'NotFound',
    meta: {
      title: 'Page not found',
      isLogin: false
    },
    component: () => import('@/views/NotFound')
  },
  // 所有未定义路由,全部重定向到404页,必须放在最后
  {
    path: '*',
    redirect: '/404'
  }
];

const router = new VueRouter({
  mode: 'hash',
  base: process.env.BASE_URL,
  /**
   * 路由跳转后页面滚动到顶部
   * 详见:https://router.vuejs.org/zh/guide/advanced/scroll-behavior.html
   */
  scrollBehavior: () => ({ y: 0 }),
  routes
});

// 路由前置守卫
router.beforeEach(({ meta, name }, _, next) => {
  const { title, isLogin } = meta;
  if (title) document.title = title;

  // token不存在时跳转非登录页,重定向到登录页
  if (!getToken() && name !== 'Login' && isLogin) next({ path: '/login' });
  // token存在时跳转登录页,重定向到首页
  else if (getToken() && name === 'Login') next({ path: '/home' });
  // 其他场景
  else next();
});

export default router;

路由守卫还有很多应用场景,有空会出一个鉴权篇的路由配置,文中有错误或者有可优化的地方欢迎指出,如果觉得写的不错,别忘记点个点赞和收藏哦,你的认可是我坚持的动力~~~ 。◕‿◕。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue Router 跳转404,路由守卫及配置(登录篇) 的相关文章

随机推荐

  • Linux字符集的查看及修改

    一 查看字符集 字符集在系统中体现形式是一个环境变量 以CentOS6 5为例 其查看当前终端使用字符集的方式可以有以下几种方式 第一种 root Testa www tmp echo LANG zh CN UTF 8 第二种 root T
  • Nvidia显卡硬件编解码能力表 官方链接

    记录用 便于快速查找 从表中得知 1070支持 H265 10bit 硬件编码 似乎不错 官方链接 https developer nvidia com video encode and decode gpu support matrix
  • C++虚函数表地址偏移

    include
  • 架构图以及vue的简介

    架构图 前后端分离总架构图 前端架构设计图 MVVM 架构模式 MVVM 的简介 MVVM 由 Model View ViewModel 三部分构成 Model 层代表数据模型 也可以在Model中定义数据修改和操作的业务逻辑 View 代
  • 公务员和事业单位的差别有多大?

    公务员和事业单位是两种不同的就业形式和组织类型 它们在以下几个方面存在一些差别 1 归属关系 公务员属于政府部门的编制人员 直接依附于政府机构 而事业单位是独立法人实体 独立承担法人责任 不隶属于政府机构 2 支付方式 公务员工资由政府财政
  • 算法训练 P0505

    标题 include
  • 基于GBDT+LR模型的深度学习推荐算法

    GBDT LR算法最早是由Facebook在2014年提出的一个推荐算法 该算法分两部分构成 第一部分是GBDT 另一部分是LR 下面先介绍GBDT算法 然后介绍如何将GBDT和LR算法融合 1 1 GBDT算法 GBDT的全称是 Grad
  • flutter GridView和Wrap

    GridView有2种gridDelegate 记录小嵌套冲突的问题 SingleChildScrollView ListView GrilView嵌套问题解决 子布局添加属性 physics NeverScrollableScrollPh
  • Windows 10 Office文件图标异常处理(Word

    1 我们经常会遇到office重新安装完成后 或者换了版本后 前期做好的excel ppt word文件可以正常打开 但图标显示为白色或者异常 备注 如果不能正常打开 则是office程序没有关联到 只需要选中需打开文件 右键 更改 里面找
  • MODBUS TCP协议实例数据帧详细分析

    MODBUS TCP协议实例数据帧详细分析 1 简介 2 ModbusTCP数据帧 2 1 报文头MBAP 2 2 帧结构PDU 3 ADU详细结构 3 1 0x01 读线圈 3 2 0x02 读离散量输入 3 3 0x03 读保持寄存器
  • 达梦数据库,大小写敏感这个参数怎么设置

    达梦数据库 大小写敏感这个参数怎么设置 1 1 现象描述 达梦在安装完软件后 需要初始化数据库实例 其他大部分数据库 也是同样的操作 但是 达梦在初始化数据库实例前 有几个需要特别注意的参数 这几个参数一定要特别关注 因为如果设置错了 是不
  • pytorch学习之Condition GAN与代码的部分解析

    1 首先 GAN网络是有生成器和判别器 比如可以生成新的图像 而CGAN则是添加了条件 生成有限制的图像 比如生成带微笑的人脸 CGAN的架构如下 2 主要部分的代码 定义判别器 class Discriminator nn Module
  • IMX6学习记录(8)-更换linux配置,加速启动

    上面是我的微信和QQ群 欢迎新朋友的加入 之前启动的时候将近是1分钟 这个时间太浪费了 更新一下内核的配置 让启动速度更快一些 更新之后 启动时间大概10秒左右 一共三个内容 来源是板子附带源码里面的文件 1 配置文件 2 设备树文件 3
  • 一种使用TCP自定义加密通信的APT样本分

    概述 为了确保通信安全和隐私以及应对各种窃听和中间人攻击 越来越多的网络流量被加密 然而 攻击者也可以通过这种方式来隐藏自己的信息和行踪 近期我们捕获了一个样本 此样本就是使用了加密通信 为了深入研究此样本的加密通信机制 接下来我们来逐层剖
  • 剑指OfferII019 最多删除一个字符得到回文

    文章目录 题目 思路 代码 优化 思路 代码 题目 思路 暴力破解 因为只让替换一个字符 我们双指针扫描的时候如果发现对不上 就先跳过让count 1 下次如果对不上并且count 1的时候 就返回false 但是 代码 class Sol
  • 【满分】【华为OD机试真题2023 JAVA&JS】机器人活动区域

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 机器人活动区域 知识点深搜广搜 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 现有一个机器人 可放置于 M N的网格中任意位置 每个网格包含一个非负整数编号 当
  • (实战)sklearn----多元线性回归&sklearn----多项式回归

    import numpy as np from numpy import genfromtxt from sklearn import linear model import matplotlib pyplot as plt from mp
  • 微信小程序怎么设置服务器上,如何为微信小程序设置服务器地址?-微信小程序服务器诗...

    腾讯要求微信小程序使用到的域名都需要在公众平台中进行设置 可以说是一种备案 那么如何为微信小程序设置服务器域名地址呢 工具 原料 1 电脑互联网 方法 步骤 2 首先用小程序账号登陆微信公众平台 然后点击左下角的 设置 之后点击右侧上部的
  • 深度学习-环境搭建(安装Pytorch)

    文章目录 前言 一 安装Anaconda 二 查看电脑显卡支持的CUDA版本 三 更新CUDA版本 四 创建并激活Anaconda虚拟环境 需要创建虚拟环境而最好不在base下载的原因 五 安装pytorch PS 注意事项 六 下载其他库
  • Vue Router 跳转404,路由守卫及配置(登录篇)

    在这个前端技术迭代迅速的时代 单页面应用开发中 路由守卫已经是非常常见也是必备的需求 为了控制使用者在各种状态下的路由页面跳转 例如 是否登录 是否有路由权限等等 今天就记录一下在各种登录状态下路由配置和路由守卫 Vue Router官方文