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 相关文章推荐
javascript实现上传图片前的预览(TX的面试题)
Aug 20 Javascript
JavaScript 模拟用户单击事件
Dec 31 Javascript
JavaScript写的一个自定义弹出式对话框代码
Jan 17 Javascript
javascript操作cookie的文章(设置,删除cookies)
Apr 01 Javascript
jquery简单实现图片切换效果的方法
May 12 Javascript
基于JS实现弹出一个隐藏的div窗口body页面变成灰色并且不可被编辑
Dec 14 Javascript
AngularJS常见过滤器用法实例总结
Jul 06 Javascript
微信小程序模板(template)使用详解
Jan 31 Javascript
Vue监听事件实现计数点击依次增加的方法
Sep 26 Javascript
浅入深出Vue之组件使用
Jul 11 Javascript
Vue图片浏览组件v-viewer用法分析【支持旋转、缩放、翻转等操作】
Nov 04 Javascript
vue 实现单选框设置默认选中值
Nov 07 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中的Streams详细介绍
2014/11/12 PHP
PHP判断当前使用的是什么浏览器(推荐)
2019/10/27 PHP
浅析PHP echo 和 print 语句
2020/06/30 PHP
解决PHPstudy Apache无法启动的问题【亲测有效】
2020/10/30 PHP
IE6下opacity与JQuery的奇妙结合
2013/03/01 Javascript
javascript级联下拉列表实例代码(自写)
2013/05/10 Javascript
JS实现的省份级联实例代码
2013/06/24 Javascript
浏览器兼容console对象的简要解决方案分享
2013/10/24 Javascript
javascript父、子页面交互技巧总结
2014/08/08 Javascript
node.js中的fs.chmodSync方法使用说明
2014/12/18 Javascript
jquery图片切换插件
2015/03/16 Javascript
详解微信小程序 wx.uploadFile 的编码坑
2017/01/23 Javascript
关于jQuery EasyUI 中刷新Tab选项卡后一个页面变形的解决方法
2017/03/02 Javascript
node跨域请求方法小结
2017/08/25 Javascript
微信小程序使用image组件显示图片的方法【附源码下载】
2017/12/08 Javascript
ES6学习笔记之map、set与数组、对象的对比
2018/03/01 Javascript
详解多页应用 Webpack4 配置优化与踩坑记录
2018/10/16 Javascript
vue 属性拦截实现双向绑定的实例代码
2018/10/24 Javascript
微信小程序实现的动态设置导航栏标题功能示例
2019/01/31 Javascript
在Vue中使用HOC模式的实现
2020/08/23 Javascript
WebStorm无法正确识别Vue3组合式API的解决方案
2021/02/18 Vue.js
[02:08]DOTA2英雄基础教程 马格纳斯
2014/01/17 DOTA
Python 深入理解yield
2008/09/06 Python
shelve  用来持久化任意的Python对象实例代码
2016/10/12 Python
IntelliJ IDEA安装运行python插件方法
2018/12/10 Python
详解opencv Python特征检测及K-最近邻匹配
2019/01/21 Python
python绘制直方图和密度图的实例
2019/07/08 Python
python实现差分隐私Laplace机制详解
2019/11/25 Python
Python常用数字处理基本操作汇总
2020/09/10 Python
基于HTML5 Canvas 实现弹出框效果
2017/06/05 HTML / CSS
Too Faced官网:美国知名彩妆品牌
2017/03/07 全球购物
好邻里事迹材料
2014/01/16 职场文书
俄语专业职业生涯规划
2014/02/26 职场文书
公司合并协议书范本
2014/09/30 职场文书
教师个人年终总结
2015/02/11 职场文书
Python函数对象与闭包函数
2022/04/13 Python