Vue中的验证登录状态的实现方法
Vue项目中实现用户登录及token验证
先说一下我的实现步骤:
- 使用easy-mock新建登录接口,模拟用户数据
- 使用axios请求登录接口,匹配账号和密码
- 账号密码验证后,拿到token,将token存储到sessionStorage中,并跳转到首页
- 前端每次跳转时,就使用导航守卫(vue-router.beforeEach)判断sessionStorage中有无token,没有就跳转到登录页面,有则跳转到对应路由页面。
- 注销后,就清除sessionStorage里的token信息并跳转到登录页面
使用easy-mock模拟用户数据
我用的是easy-mock,新建了一个接口,用于模拟用户数据:
{ "error_code":0, "data":[{ "id":'1', "usertitle":"管理员", "username":"admin", "password":"123456", "token":"@date(T)", }, { "id":'2', "usertitle":"超级管理员", "username":"root", "password":"root", "token":"@date(T)", } ] }
login.vue中写好登陆框:
用户名:
密码:
然后下载axios:npminstallaxios--save,用来请求刚刚定义好的easy-mock接口:
login(){ constself=this; axios.get('https://easy-mock.com/mock/5c7cd0f89d0184e94358d/museum/login').then(response=>{ varres=response.data.data, len=res.length, userNameArr=[], passWordArr=[], ses=window.sessionStorage; //拿到所有的username for(vari=0;i{ console.log('连接数据库失败!') }) }
这一步最重要的是当账号密码正确时,把请求回来的token放在sessionStorage中,
配置路由
然后配置路由新加一个meta属性:
{ path:'/', name:'login', component:login, meta:{ needLogin:false } }, { path:'/index', name:'index', component:index, meta:{ needLogin:true } }
判断每次路由跳转的链接是否需要登录,
导航卫士
在main.js中配置一个全局前置钩子函数:router.beforeEach(),他的作用就是在每次路由切换的时候调用
这个钩子方法会接收三个参数:to、from、next。
- to:Route:即将要进入的目标的路由对象,
- from:Route:当前导航正要离开的路由,
- next:Function:个人理解这个方法就是函数结束后执行什么,先看官方解释
- 1.next():进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是confirmed(确认的),
- 2.next(false):中断当前的导航。如果浏览器的url改变了(可能是用户手动或浏览器后退按钮),那么url地址会重置到from路由对应的地址。
- 3.next('/')或next({path:'/'}):跳转到一个不同的地址。当前导航被中断,进入一个新的导航。
用sessionStorage存储用户token
//路由守卫 router.beforeEach((to,from,next)=>{ //路由中设置的needLogin字段就在to当中 if(window.sessionStorage.data){ console.log(window.sessionStorage); //console.log(to.path)//每次跳转的路径 if(to.path==='/'){ //登录状态下访问login.vue页面会跳到index.vue next({path:'/index'}); }else{ next(); } }else{ //如果没有session,访问任何页面。都会进入到登录页 if(to.path==='/'){//如果是登录页面的话,直接next()-->解决注销后的循环执行bug next(); }else{//否则跳转到登录页面 next({path:'/'}); } } })
这里用了router.beforeEachvue-router导航守卫
每次跳转时都会判断sessionStorage中是否有token值,如果有则能正常跳转,如果没有那么就返回登录页面。
注销
至此就完成了一个简单的登录状态了,浏览器关闭后sessionStorage会清空的,所以当用户关闭浏览器再打开是需要重新登录的
当然也可以手动清除sessionStorage,清除动作可以做成注销登录,这个就简单了。
loginOut(){ //注销后清除session信息,并返回登录页 window.sessionStorage.removeItem('data'); this.common.startHacking(this,'success','注销成功!'); this.$router.push('/index'); }
写一个清除sessionStorag的方法。
一个简单的保存登录状态的小Demo。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。