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 相关文章推荐
createElement动态创建HTML对象脚本代码
Nov 24 Javascript
JavaScript isArray()函数判断对象类型的种种方法
Oct 11 Javascript
javascript下拉列表菜单的实现方法
Nov 18 Javascript
mvvm双向绑定机制的原理和实现代码(推荐)
Jun 07 Javascript
jQuery封装的屏幕居中提示信息代码
Jun 08 Javascript
js实现图片缓慢放大缩小效果
Aug 02 Javascript
微信小程序中用WebStorm使用LESS
Mar 08 Javascript
Angular排序实例详解
Jun 28 Javascript
基于rem的移动端响应式适配方案(详解)
Jul 07 Javascript
详解基于vue-router的动态权限控制实现方案
Sep 28 Javascript
详解Vue单元测试case写法
May 24 Javascript
Js中将Long转换成日期格式的实现方法
Jun 05 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
linux iconv方法的使用
2011/10/01 PHP
php加密算法之实现可逆加密算法和解密分享
2014/01/21 PHP
php的declare控制符和ticks教程(附示例)
2014/03/21 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
2014/12/24 PHP
PHP中遍历数组的三种常用方法实例分析
2019/06/24 PHP
Mozilla中显示textarea中选择的文字
2006/09/07 Javascript
50个比较实用jQuery代码段
2011/09/18 Javascript
nodejs的require模块(文件模块/核心模块)及路径介绍
2013/01/14 NodeJs
将HTML格式的String转化为HTMLElement的实现方法
2014/08/07 Javascript
javaScript中slice函数用法实例分析
2015/06/08 Javascript
javascript获取重复次数最多的字符
2015/07/08 Javascript
Jquery代码实现图片轮播效果(一)
2015/08/12 Javascript
Vue.js快速入门教程
2016/09/07 Javascript
JavaScript面试题大全(推荐)
2016/09/22 Javascript
JavaScript随机生成颜色的方法
2016/10/15 Javascript
js,jq,css多方面实现简易下拉菜单功能
2017/05/13 Javascript
微信小程序 自定义消息提示框
2017/08/06 Javascript
iframe与主框架跨域相互访问实现方法
2017/09/14 Javascript
switchery按钮的使用方法
2017/12/18 Javascript
Vue实现商品分类菜单数量提示功能
2019/07/26 Javascript
vue+elementUi图片上传组件使用详解
2019/08/20 Javascript
jQuery列表动态增加和删除的实现方法
2020/11/05 jQuery
解决element-ui的下拉框有值却无法选中的情况
2020/11/07 Javascript
[07:09]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant 选手采访
2021/03/11 DOTA
Python使用分布式锁的代码演示示例
2018/07/30 Python
Python 按字典dict的键排序,并取出相应的键值放于list中的实例
2019/02/12 Python
基于python生成器封装的协程类
2019/03/20 Python
探秘TensorFlow 和 NumPy 的 Broadcasting 机制
2020/03/13 Python
韩国家庭购物网上商店:Nsmall
2017/05/07 全球购物
阿根廷首家户外用品制造商和经销商:Montagne
2018/02/12 全球购物
Carter’s OshKosh加拿大:购买婴幼儿服装和童装
2018/11/27 全球购物
介绍一下HDLC(High-Level Data Link Control)高层数据链路协议
2012/01/21 面试题
英语商务邀请函范文
2014/01/16 职场文书
中秋节晚会开场白
2015/05/29 职场文书
大学开学感言
2015/08/01 职场文书
CSS布局之浮动(float)和定位(position)属性的区别
2021/09/25 HTML / CSS