利用路由守卫实现token访问拦截

本文介绍了如何在项目中通过添加全局路由守卫实现路径访问拦截,包括使用token验证用户权限,限制未登录用户只能访问登录和404页面,登录用户不能直接访问登录页面,确保了系统的安全性。
摘要由CSDN通过智能技术生成

需求:在项目中,我们经常会遇到对路径访问的拦截,如:未登录时,只允许访问登录和404页面,在登录后,不允许直接通过url访问登录页面等。本文章将对该需求做简单介绍。

一、实现思路

添加全局路由守卫,判断当前页面是否有token,如果有,则可以访问首页等页面,但不能访问登录页面,访问登录页面时,需重定向至首页;如果没有token,则可以访问包含登录页面在内的白名单列表页面,不可访问其他页面,访问其他页面则要重定向至登录页面。

二、实现举例

        1、新建utils/permission.js页面,具体内容如下:

import router from '@/router'
import store from '@/store'

// 设置未登录可以访问页面的白名单
const whiteList = ['/login', '/404']

// 设置路由守卫
router.beforeEach((to, from, next) => {
  // to:跳转的路由对象
  // from:从哪里来
  // next:放行next() 重定向next(路径)
  const token = store.state.user.token
  if (token) {
    // 如果有token
    if (to.path === '/login') {
      // 如果有token,且访问登录页面,则跳转至首页
      next('/')
    } else {
      // 有token,访问其他路径,直接放行
      next()
    }
  } else {
    if (whiteList.includes(to.path)) {
      // 没有token,访问白名单,直接放行
      next()
    } else {
      // 没有token,访问其他页面,跳转登录
      next('/login')
    }
  }
})

        2、在main.js中,导入permission.js,设置全局路由守卫

// 导入路由守卫
import '@/utils/permission'

 

Vue 路由守卫是一种在路由跳转时执行的钩子函数,可以用来控制用户访问页面的权限、拦截未登录用户等。 Vue 路由守卫分为全局守卫和路由独享守卫,下面分别介绍它们的实现方法。 ## 全局守卫 全局守卫是在整个应用中都会生效的路由守卫,可以通过 Vue Router 的 `beforeEach` 方法来实现。 ```javascript // main.js import router from './router' router.beforeEach((to, from, next) => { // to: Route 即将要进入的目标路由对象 // from: Route 当前导航正要离开的路由 // next: Function 一定要调用该方法来 resolve 这个钩子。 // 它可以传入参数用来指示路由跳转的行为 // 判断用户是否登录 const isLogin = sessionStorage.getItem('token') ? true : false if (to.path === '/login') { // 如果已经登录,重定向到主页 isLogin ? next('/') : next() } else { // 如果没有登录,重定向到登录页 isLogin ? next() : next('/login') } }) ``` 上面代码中通过 `beforeEach` 方法注册了一个全局守卫,当用户每次进行路由跳转时,都会先执行该守卫,判断用户是否已登录,如果已登录,则继续访问目标路由;如果未登录,则自动跳转到登录页。 ## 路由独享守卫 路由独享守卫是只针对某个路由生效的守卫,可以通过在路由配置中添加 `beforeEnter` 方法来实现。 ```javascript // router.js import Vue from 'vue' import Router from 'vue-router' import Home from './views/Home.vue' import About from './views/About.vue' import Login from './views/Login.vue' Vue.use(Router) const router = new Router({ routes: [ { path: '/', name: 'home', component: Home }, { path: '/about', name: 'about', component: About, beforeEnter: (to, from, next) => { // 判断用户是否登录 const isLogin = sessionStorage.getItem('token') ? true : false if (isLogin) { next() } else { next('/login') } } }, { path: '/login', name: 'login', component: Login } ] }) export default router ``` 上面代码中,我们在路由配置中为 `about` 路由添加了一个 `beforeEnter` 方法,该方法只会在用户访问 `about` 路由时执行,判断用户是否已登录,如果已登录,则继续访问 `about` 路由;如果未登录,则自动跳转到登录页。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值