vue2实现路由拦截
描述:实现路由拦截,很多系统尤其是管理系统中,通常只有登录验证后才能访问后续资源,否则显示没有权限或跳转登录页面。
1. 在路由定义中添加meta: {authRequired: true}属性
在需要登录才能访问的路由添加上meta: {authRequired: true}
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
const routes = [
{
path: '/',
redirect: '/login'
},
{
path: '/about',
name: 'About',
meta: {
authRequired: true
},
component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
},
{
path: '/login',
name: 'Login',
component: () => import(/* webpackChunkName: "login" */ '../views/Login.vue')
},
{
path: '/home',
name: 'Home',
meta: {
authRequired: true
},
component: () => import(/* webpackChunkName: "home" */ '../views/Home.vue')
}
]
const router = new VueRouter({
routes
})
export default router
2.设置重写router的beforeEach方法
在router文件中,编写beforeEach方法
// 跳转路由前执行的钩子函数
// to: 即将要进入的路由对象,from: 当前导航正要离开的路由,next:下一步执行的方法,参数是包含跳转路径的对象
router.beforeEach((to, from, next) =>{
// 判断是否需要登录
if(to.meta.authRequired){
if(localStorage.getItem('satoken')){
next();
}else{
next({
path: '/login',
// 把当前页面的路由path作为参数传递给登录页面,登录成功后跳转到去往的页面
query: {redirect: to.fullPath}
})
}
}else {
// 没有要求登录,直接跳转
next();
}
})
3.为了有更友好的体验,在login页面做个跳转提示
在mounted中添加是否跳转判断(Message是Element的组件)
// 判断是否登陆后需要跳转,需要跳转(即是带有redirect参数的,弹出“先登录”窗口)
if (this.$route.query.redirect) {
Message({
message: "请先登录",
type: 'warning',
})
}
4.登录后进行路由跳转
在登录请求成功后,判断是否有redirect参数,有则跳转到redirect路由中去
if (this.$route.query.redirect) {
this.$router.push(''+this.$route.query.redirect)
}else {
this.$router.push('/home')
}