Vue中的验证登录状态的实现方法


Posted in Javascript onMarch 09, 2019

Vue项目中实现用户登录及token验证

先说一下我的实现步骤:

  1. 使用easy-mock新建登录接口,模拟用户数据
  2. 使用axios请求登录接口,匹配账号和密码
  3. 账号密码验证后, 拿到token,将token存储到sessionStorage中,并跳转到首页
  4. 前端每次跳转时,就使用导航守卫(vue-router.beforeEach)判断 sessionStorage 中有无 token ,没有就跳转到登录页面,有则跳转到对应路由页面。
  5. 注销后,就清除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中写好登陆框:

<template>
<div>
  <p>用户名:<input type='text' v-model="userName"></p>
  <p>密码:<input type='text' v-model="passWord"></p>
  <button @click="login()">登录</button>
</div>
</template>
<script>
 export default {
  data() {
    return {
     userName:'root',
     passWord:'root'
    }
  }
}
</script>

然后下载axios:npm install axios --save,用来请求刚刚定义好的easy-mock接口:

login(){
    const self = this;
    axios.get('https://easy-mock.com/mock/5c7cd0f89d0184e94358d/museum/login').then(response=>{
     var res =response.data.data,
       len = res.length,
       userNameArr= [],
       passWordArr= [],
       ses= window.sessionStorage; 
     // 拿到所有的username
     for(var i=0; i<len; i++){
      userNameArr.push(res[i].username);
      passWordArr.push(res[i].password);
     }
     console.log(userNameArr, passWordArr);
     if(userNameArr.indexOf(this.userName) === -1){
       alert('账号不存在!');
     }else{
      var index = userNameArr.indexOf(this.userName);
      if(passWordArr[index] === this.passWord){
       // 把token放在sessionStorage中
       ses.setItem('data', res[index].token);
       this.$parent.$data.userTitle = res[index].usertitle;
       //验证成功进入首页
       this.startHacking ('登录成功!');
       //跳转到首页
       this.$router.push('/index');
       // console.log(this.$router);
      }else{
       alert('密码错误!')
      }
     }
    }).catch(err=>{
     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.beforeEach vue-router导航守卫

每次跳转时都会判断sessionStorage中是否有token值,如果有则能正常跳转,如果没有那么就返回登录页面。

注销

至此就完成了一个简单的登录状态了,浏览器关闭后sessionStorage会清空的,所以当用户关闭浏览器再打开是需要重新登录的

当然也可以手动清除sessionStorage,清除动作可以做成注销登录,这个就简单了。

loginOut(){
  // 注销后 清除session信息 ,并返回登录页
  window.sessionStorage.removeItem('data');
  this.common.startHacking(this, 'success', '注销成功!');
  this.$router.push('/index'); 
  }

写一个清除sessionStorag的方法。

一个简单的保存登录状态的小Demo。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
Aug 14 Javascript
JavaScript 解析Json字符串的性能比较分析代码
Dec 16 Javascript
jquery实现鼠标滑过显示二级下拉菜单效果
Aug 24 Javascript
js滚动条平滑移动示例代码
Mar 29 Javascript
jquery实现网站列表切换效果的2种方法
Aug 12 Javascript
js利用for in循环获取 一个对象的所有属性以及值的实例
Mar 30 Javascript
JS设计模式之惰性模式(二)
Sep 29 Javascript
jQuery中ajax获取数据赋值给页面的实例
Dec 31 jQuery
JS获取指定月份的天数两种实现方法
Jun 22 Javascript
Vue 使用计时器实现跑马灯效果的实例代码
Jul 11 Javascript
JavaScript实现九宫格拖拽效果
Jun 28 Javascript
JS前端可扩展的低代码UI框架Sunmao使用详解
Jul 23 Javascript
在NPM发布自己造的轮子的方法步骤
Mar 09 #Javascript
使用pm2部署node生产环境的方法步骤
Mar 09 #Javascript
Koa日志中间件封装开发详解
Mar 09 #Javascript
详解vue2.6插槽更新v-slot用法总结
Mar 09 #Javascript
Node.js Stream ondata触发时机与顺序的探索
Mar 08 #Javascript
详解JSON和JSONP劫持以及解决方法
Mar 08 #Javascript
Node.js Event Loop各阶段讲解
Mar 08 #Javascript
You might like
php 阴历-农历-转换类代码
2012/01/16 PHP
解析php中反射的应用
2013/06/18 PHP
4种PHP异步执行的常用方式
2015/12/24 PHP
浅谈PHP进程管理
2019/03/08 PHP
精通Javascript系列之数据类型 字符串
2011/06/08 Javascript
简介JavaScript中的unshift()方法的使用
2015/06/09 Javascript
JavaScript中的Function函数
2015/08/27 Javascript
JS实现自动变换的菜单效果代码
2015/09/09 Javascript
在Vue组件化中利用axios处理ajax请求的使用方法
2017/08/25 Javascript
Angular 4中如何显示内容的CSS样式示例代码
2017/11/06 Javascript
使用layui监听器监听select下拉框,事件绑定不成功的解决方法
2019/09/28 Javascript
vue.js路由mode配置之去掉url上默认的#方法
2019/11/01 Javascript
[02:04]2016国际邀请赛中国区预选赛VG.R晋级之路
2016/07/01 DOTA
[55:03]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第二场 11.20
2020/11/20 DOTA
pygame游戏之旅 调用按钮实现游戏开始功能
2018/11/21 Python
在pycharm 中添加运行参数的操作方法
2019/01/19 Python
Python multiprocessing多进程原理与应用示例
2019/02/28 Python
Python 3.8新特征之asyncio REPL
2019/05/28 Python
Python用Try语句捕获异常的实例方法
2019/06/26 Python
在python shell中运行python文件的实现
2019/12/21 Python
pandas读取csv文件提示不存在的解决方法及原因分析
2020/04/21 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
2020/06/29 Python
HTML5的结构和语义(5):内嵌媒体
2008/10/17 HTML / CSS
Nike澳大利亚官网:Nike.com (AU)
2019/06/03 全球购物
美国家居用品和厨具购物网站:DealsDot
2019/10/07 全球购物
培训心得体会
2013/12/29 职场文书
同志主要表现材料
2014/08/21 职场文书
2014年小学校长工作总结
2014/12/08 职场文书
骨干教师申报材料
2014/12/17 职场文书
地道战观后感400字
2015/06/04 职场文书
小学三年级语文教学反思
2016/03/03 职场文书
25句企业管理语录:助你迅速打开思路,句句经典!
2020/01/14 职场文书
vue实现可拖拽的dialog弹框
2021/05/13 Vue.js
Python 中的Sympy详细使用
2021/08/07 Python
python中mongodb包操作数据库
2022/04/19 Python
python和Appium的移动端多设备自动化测试框架
2022/04/26 Python