一. 使用场景
1.首次登录的时,前端调后端的登录接口,发送输入框中的用户名和密码;
2.后端收到请求,验证用户名和密码,验证成功,就给前端返回一个token(令牌相当于一个门牌,如返回对象);
3.前端拿到token,将token存储到localStorage和vuex中,并跳转路由页面
4.前端每次跳转路由,就判断 localStroage 中有无 token ,没有就跳转到登录页面,有则跳转到对应路由页面
5.每次调后端接口,都要在请求头中加token
6后端判断请求头中有无token,有token,就拿到token并验证token,验证成功就返回数据,验证失败(例如:token过期)就返回401,请求头中没有token也返回401
7.如果前端拿到状态码为401,就清除token信息并跳转到登录页面(首页)
二.路由守卫的作用
对路由进行权限控制,用来判断用户是否登录,该页面用户是否有权限浏览,需要结合meta来实现
三.路由守卫的分类
全局守卫、独享守卫、组件内守卫
1.全局路由守卫
全局前置守卫:初始化时执行、每次路由切换前执行
router.beforeEach((to,from,next)=>{})
回调函数中的参数,to:进入到哪个路由去,from:从哪个路由离开,next:函数,决定是否展示放行你要看到的路由页面。
router.beforeEach((to,from,next)=>{
console.log('beforeEach',to,from)
if(to.meta.isAuth){
if(localStorage.getItem('school') === 'yangcun'){
next()
}else{
alert('暂无权限查看')
}
}else{
next()
}
})
全局后置守卫:初始化时执行、每次路由切换后执行
全局后置钩子router.afterEach((to,from)=>{})
只有两个参数,to:进入到哪个路由去,from:从哪个路由离开。
router.afterEach((to,from)=>{
console.log('afterEach',to,from)
if(to.meta.title){
document.title = to.meta.title
}else{
document.title = 'vue_test'
}
})
2.独享路由守卫
beforeEnter:(to,from,next)=>{},用法与全局守卫一致。只是,将其写进其中一个路由对象中,只在这个路由下起作用。
beforeEnter(to,from,next){
console.log('beforeEnter',to,from)
if(to.meta.isAuth){
if(localStorage.getItem('school') === 'yangcun'){
next()
}else{
alert('暂无权限查看')
}
}else{
next()
}
}
3.组件内路由守卫
到达当前守卫的组件时:
//进入守卫:通过路由规则,进入该组件时被调用beforeRouteEnter (to, from, next) {},
//离开守卫:通过路由规则,离开该组件时被调用beforeRouteLeave (to, from, next) {}
beforeRouteEnter(to,from,next){
console.log('About--beforeRouteEnter',to,from)
if(to.meta.isAuth){
if(localStorage.getItem('school')==='yangcun'){
next()
}else{
alert('暂无权限查看')
}
}else{
next()
}
},
befortRouteLeave(to,from,next){
console.log('About--beforeRouteEnte',to,from)
next()
}
}