这里我们先说说登陆以及登陆状态控制需要的插件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实现登陆以及是否登陆控制的更多相关文章

  1. vue+axios新手实践实现登陆

    vue+axios新手实践实现登陆 https://segmentfault.com/a/1190000015201803 增加 利用HTML5的history.replacestate()修改当前页 ...

  2. CentOS6无法本地登陆,ssh远程登陆没问题

    CentOS6无法本地登陆,ssh远程登陆没问题---使用CentOS自带的rsyslog分析调试 Apr 21 14:15:27 raccontroller init: tty (/dev/tty1 ...

  3. oracle记录各登陆主机用户名,登陆ip,所执行的命令

    oracle记录各登陆主机用户名,登陆ip,所执行的命令 /etc/profile #history USER_IP=`>/dev/null| awk '{print $NF}'|sed -e ...

  4. Net Core 使用外部登陆提供程序登陆的流程,以及身份认证的流程

    在Asp.Net Core 中使用外部登陆(google.微博...)   原文出自Rui Figueiredo的博文<External Login Providers in ASP.NET C ...

  5. SSH安全登陆原理:密码登陆与公钥登陆

      SSH全称(Secure SHell)是一种以安全性闻名的应用层网络通信协议,用于计算机间的安全通信,是目前比较成熟的远程登陆解决方案. 它提供两种方法登陆: 1.密码登陆 2.公钥登陆   密码 ...

  6. django开发项目实例3--用session是实现简单的登陆、验证登陆和注销功能

    如果你的网页不是纯阅读型的,那么你很有可能希望在用户打开某些界面的时候需要验证用户是否登陆的信息, 虽然django里面有自带的一些user的类,但我看不懂,并且自己实现也不是很难,下面和大家分享一下 ...

  7. .Net Mvc判断用户是否登陆、未登陆跳回登陆页、三种完美解决方案

    开篇先不讲解,如何判断用户是否登陆,我们先来看用户登录的部分代码,账户密码都正确后,先将当前登录的用户名记录下来. public ActionResult ProcessLogin() { try { ...

  8. 借助Cookie实现是否第一次登陆/显示上次登陆时间

    Cookie实现是否第一次登陆/显示上次登陆时间 最近刚好看到Cookie这方面知识,对Servlet部分知识已经生疏,重新翻出已经遗弃角落的<JavaWeb开发实战经典>,重新温习了Co ...

  9. Cookie实现是否第一次登陆/显示上次登陆时间

    Cookie实现是否第一次登陆/显示上次登陆时间 最近刚好看到Cookie这方面知识,对Servlet部分知识已经生疏,重新翻出已经遗弃角落的<JavaWeb开发实战经典>,重新温习了Co ...

随机推荐

  1. ASP.NET Core Web Api之JWT(一)

    前言 最近沉寂了一段,主要是上半年相当于休息和调整了一段时间,接下来我将开始陆续学习一些新的技术,比如Docker.Jenkins等,都会以生活实例从零开始讲解起,到时一并和大家分享和交流.接下来几节 ...

  2. printf函数的返回值

    先看下面一段程序: 文末会给大家推荐几本好书,希望能够需要的朋友一点帮助! #include <stdio.h> int main() { int i = 123; printf(&quo ...

  3. linux 不重启识别新添加的硬盘

    1.fdisk -l 看有没有新的磁盘 oebiotech@hadoop08:/media/nbc9$ sudo fdisk -l |grep sdl 2.查看主机总线 oebiotech@hadoo ...

  4. 【排序函数讲解】sort-C++

    c++标准库里的排序函数,用于对给定区间所有元素进行排序.头 文件是#include 使用 Sort()在具体实现中规避了经典快速排序可能出现的.会导 致实际复杂度退化到 o(n²)的极端情况.它根据 ...

  5. Scrum 使用絮叨

    关于Scrum 的一些絮叨 Scrum 的推行的基础在于全员参与,全员协作,包含Dev, QA(quality assurance) ,BA(Business analyst)以及Supporter ...

  6. Spring 注解编程之 AnnotationMetadata

    在上篇文章 Spring 注解编程之模式注解 中我们讲到 Spring 模式注解底层原理,依靠 AnnotationMetadata 接口判断是否存在指定元注解. 这篇文章我们主要深入 Annotat ...

  7. Spring Cloud 之 Zuul基础.

    一.概述  API 网关是一个更为智能的应用服务器,它的定义类似于面向对象设计模式中的 Facade 模式,它的存在就像是整个微服务架构系统的门面一样,所有的外部客户端访问都需要经过它来进行调度和过滤 ...

  8. html提示框插件

    最近工作需要,用到各式各样的提示框,寻找了很久,发现一个的第三方的插件很好用,各种样式.接口良好.允许自定义. 官网:http://layer.layui.com/ 使用需要先引入jq1.8以上: & ...

  9. php 排序和置顶功能实现

    (1)排序操作思路 一般来说都是按照发布时间排序.时间戳大的靠前,所以用倒序desc,而不是asc (2)置顶操作思路: 点击置顶时,修改数据库addtime字段值为当前时间即可.因为排序是按照时间戳 ...

  10. 详述Spring对数据校验支持的核心API:SmartValidator

    每篇一句 要致富,先修路.要使用,先...基础是需要垒砌的,做技术切勿空中楼阁 相关阅读 [小家Java]深入了解数据校验:Java Bean Validation 2.0(JSR303.JSR349 ...