koa2+vue实现登陆及登录状态判断


Posted in Javascript onAugust 15, 2019

这里我们先说说登陆以及登陆状态控制需要的插件jsonwebtoken,jsonwebtoken就可以实现token的生成与反向解密出用户数据。

安装步骤: npm install jsonwebtoken --save

安装之后先创建一个token.js, 为了项目目录的清晰,可以创建一个token文件夹,将token.js放到里面。文件创建OK之后,该是写内容了,写内容之前先说说jsonwebtoken提供的方法:

1、sign: 生成token、2、decod: 解析token。 这两个方法就是我们常用的加密和解密用的方法。

token.js 我们先定义两个方法addtoken(生成token)、decrypt(解析前台传递的token), 这里直接上代码

token.js内容:

const jwt = require('jsonwebtoken');
const serect = 'token'; //生成token所需要的密钥
let token = {
  addToken: (userInfo) => {
    const token = jwt.sign({ //这个函数需要三个参数, 第一个一般是登陆用户的名字, 第二个就是上面定义的密钥,第三个是过期时间 单位是s ,不过还可以写 {expiresIn:'2h'}(代表2小时)
      user: userInfo.user,
      id: userInfo.id
    }, serect, {expiresIn: 1});
    return token;
  },
  decrypt: (token) => {
    if (token) {
      let toke = tokens.split(' ')[1];
      // 解析
      let decoded = jwt.decode(toke, serect); //解析token需要两个参数,密钥 以及 前台传递的token
      return decoded;
    }
  }
}
exports = module.exports = token;

然后修改登陆接口, 登陆之后要将生成的token传递给前台, 直接看代码:

const addToken = require('../token/token')
router.post('/login',async (ctx)=> {
  let username = ctx.request.body.username;
  let password = ctx.request.body.password
  await userModel.selectUser([username]).then(async res => {
    if (res.length === 0) {
      ctx.body = {
        code: 102,
        message: '对不起账号不存在'
      }
    } else {
      if (await md5.MD5(password,res[0].solt) === res[0].password) {
        const token = addToken.addToken({user: res[0].name, id: res[0].id}) //主要是这里 生成token
        ctx.body = {
          code: 100,
          message: '登陆成功',
          token
        }
      } else {
        ctx.body = {
          code: 101,
          message: '对不起密码错误'
        }
      }
    }
  })
})

后台传递的token值,前台需要保存,我们使用的vue所以可以使用vuex将收到的token保存起来(这里提示vuex当页面刷新里面的数据会清除,所以建议保存在localStorage里面当然也可以使用vuex-along 这个组件,这个组件其实就是帮我们把vuex的数据再保存在loaclStorage里面)

axios.post('/api/login', user).then(({status, data}) => {
          if (status === 200) {
            if (data.code === 102) {
              alert('对不起账号不存在')
            } else if (data.code === 101) {
              alert('对不起密码不正确')
            } else if (data.code === 100) {
              alert('登陆成功')
              console.log(data)
              this.$store.dispatch('tokenAddFun', data.token)
              this.$store.dispatch('userAddFun', user.username)
              this.$router.push('/')
            }
          }
        })

然后在每次请求的时候将token添加在请求的头信息中: 我们使用的是axios,所以可以使用axios的请求拦截器,修改其头头信息,这样就不用在每个请求中添加。添加axios目录然后添加axios.js文件,内容如下:

import axios from 'axios'
import store from '../store'
axios.interceptors.request.use(
  config => {
    config.headers.common['Authorization'] = 'Bearer '+ store.state.token;
    return config
  }
)
export default axios

需要请求的时候 导入自己写的这个js文件(导入自己写的这个文件之后就不需要导入 axios插件了)测试请求代码如下:

import axios from '../../../axios/axios'
axios.get('/api/userlist').then(({status, data}) => {
          if (status === 200) {
            if (data.code !== 100) {
             alert('对不起,session过期,请重新登陆');
             this.$router.push('/login')
            } else {
              this.showData()
            }
          }
        })

 后台koa2接收到请求之后先对请求头携带token进行解析,然后对比是否过期,具体代码如下:

const token = require('../token/addtoken')
router.get('/userlist', async (ctx, next) => {
 let webToken = ctx.request.header.authorization; //获取头部信息携带的token
 if (webToken){
  // 获取到token
  let res = token.decrypt(webToken); //解析token
  if (res && res.exp <= new Date()/1000){ //进行时间对比
   ctx.body = {
    message: 'token过期',
    code:102
   };
  } else {
   ctx.body = {
    message: '解析成功',
    code:100
   }
  }
 } else{ // 没有取到token
  ctx.body = {
   msg:'没有token',
   code: 101
  }
 }
})

 后台通过上述的方法,将数据以及登陆状态传递给前台,前台进行逻辑判断 就可以实现登陆状态的判断

总结

以上所述是小编给大家介绍的koa2+vue实现登陆及登录状态判断,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢

Javascript 相关文章推荐
js 居中漂浮广告
Mar 21 Javascript
JavaScript执行顺序详细介绍
Dec 04 Javascript
深入剖析JavaScript中的枚举功能
Mar 06 Javascript
javascript中html字符串转化为jquery dom对象的方法
Aug 27 Javascript
跟我学习javascript的异步脚本加载
Nov 20 Javascript
js中的关联数组与普通数组详解
Jul 27 Javascript
引用jquery框架后出错的解决方法
Aug 09 Javascript
全面总结Javascript对数组对象的各种操作
Jan 22 Javascript
jQuery实现table表格checkbox全选的方法分析
Jul 04 jQuery
使用svg实现动态时钟效果
Jul 17 Javascript
微信小程序绑定手机号获取验证码功能
Oct 22 Javascript
JavaScript 反射和属性赋值实例解析
Oct 28 Javascript
原生js实现的移动端可拖动进度条插件功能详解
Aug 15 #Javascript
快速对接payjq的个人微信支付接口过程解析
Aug 15 #Javascript
Element-UI中关于table表格的那些骚操作(小结)
Aug 15 #Javascript
原生js实现可兼容PC和移动端的拖动滑块功能详解【测试可用】
Aug 15 #Javascript
js设计模式之单例模式原理与用法详解
Aug 15 #Javascript
js设计模式之代理模式及订阅发布模式实例详解
Aug 15 #Javascript
JS实现水平遍历和嵌套递归操作示例
Aug 15 #Javascript
You might like
escape unescape的php下的实现方法
2007/04/27 PHP
php5 mysql分页实例代码
2008/04/10 PHP
php面向对象全攻略 (十四) php5接口技术
2009/09/30 PHP
PHP上传文件时自动分配路径的方法
2015/01/09 PHP
发一个自己用JS写的实用看图工具实现代码
2008/07/26 Javascript
javascript 构造函数强制调用经验总结
2012/12/02 Javascript
json实现前后台的相互传值详解
2015/01/05 Javascript
JavaScript中实现单体模式分享
2015/01/29 Javascript
jQuery Validate表单验证插件 添加class属性形式的校验
2016/01/18 Javascript
jQuery实现的导航下拉菜单效果示例
2016/09/05 Javascript
nodejs简单实现操作arduino
2016/09/25 NodeJs
jQuery解析XML 详解及方法总结
2016/09/28 Javascript
详细分析jsonp的原理和实现方式
2017/11/20 Javascript
修改node.js默认的npm安装目录实例
2018/05/15 Javascript
如何在Angular8.0下使用ngx-translate进行国际化配置
2019/07/24 Javascript
JavaScript手写数组的常用函数总结
2020/11/22 Javascript
[44:50]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 TNC vs VG
2018/04/02 DOTA
浅谈Python处理PDF的方法
2017/11/10 Python
python将图片转base64,实现前端显示
2020/01/09 Python
Python3.x+迅雷x 自动下载高分电影的实现方法
2020/01/12 Python
python程序如何进行保存
2020/07/03 Python
微信端html5页面调用分享接口示例
2018/03/14 HTML / CSS
方太官方网上商城:销售方太抽油烟机、燃气灶、消毒柜等
2017/01/17 全球购物
网站设计师的岗位职责
2013/11/21 职场文书
关于运动会的稿件
2014/02/02 职场文书
致200米运动员广播稿
2014/02/06 职场文书
应届大专毕业生自我鉴定
2014/04/08 职场文书
新年寄语大全
2014/04/12 职场文书
2013年最新自荐信范文
2014/06/23 职场文书
好的促销活动方案
2014/08/21 职场文书
群众路线自我剖析材料
2014/10/08 职场文书
校长师德表现自我评价
2015/03/05 职场文书
2014年个人年终总结
2015/03/09 职场文书
Python爬虫框架之Scrapy中Spider的用法
2021/06/28 Python
Java 超详细讲解设计模式之中的抽象工厂模式
2022/03/25 Java/Android
HTML 里 img 元素的 src 和 srcset 属性的区别详解
2023/05/21 HTML / CSS