koa 实现session登陆

在我们访问一些网站内部内容的时候,通常都会先验证我们是否已经登陆,如果登陆了就跳转到内容页面否则就跳转或者弹出登陆页面。
但是HTTP协议是没有状态的协议,无法标识一个用户的登录状态。
于是Cookies和Session的应用就很好的解决了这个问题。
koa实现session登陆的方法很简单,首先引入依赖'koa-session'
const session = require('koa-session');
配置session参数
//session配置
const session_signed_key = ["some secret hurr"]; // 这个是配合signed属性的签名key
const sessionConfig = {
key: 'koa:sess', //cookie key (default is koa:sess)
maxAge: 1800000, // 过期时间(毫秒) maxAge in ms (default is 1 days)
overwrite: true, //是否可以overwrite (默认default true)
httpOnly: true, //cookie是否只有服务器端可以访问 httpOnly or not (default true)
signed: true, //签名默认true
rolling: false, //在每次请求时强行设置cookie,这将重置cookie过期时间(默认:false)
renew: false, //(boolean) renew session when session is nearly expired,
};
加载中间件(一定要注意中间件的加载顺序)
app.keys = session_signed_key;
app.use(session(CONFIG, app));
登录接口部分
/**
* 登陆
* @author Shellcoochi
* @param ctx
* @param next
* @returns {Promise<void>}
*/
let fn_sign_in = async (ctx, next) => {
let name = ctx.request.body.username || '',
password = ctx.request.body.password || '';
console.log(`signin with name: ${name}, password: ${password}`);
if (name === 'Shellcoochi' && password === '12345') {
//设置session
ctx.session.userState = true;
ctx.session.username = name; ctx.response.body = {
state:'success',
msg:'登陆成功'
};
console.log('登陆成功');
} else {
ctx.response.body = {state:'defeat'};
}
};
设置session的同时我们也可以设置前端的Cookies
/**
* 登陆
* @author Shellcoochi
* @param ctx
* @param next
* @returns {Promise<void>}
*/
let fn_sign_in = async (ctx, next) => {
let name = ctx.request.body.username || '',
password = ctx.request.body.password || '';
console.log(`signin with name: ${name}, password: ${password}`);
if (name === 'Shellcoochi' && password === '12345') {
//设置session
ctx.session.userState = true;
ctx.session.username = name;
//设置cookie
ctx.cookies.set(
'shellcoochi@',//name
'mytoken@', //value(可替换为token)
cookieConfig
);
ctx.response.body = {
state:'success',
msg:'登陆成功'
};
console.log('登陆成功');
} else {
ctx.response.body = {state:'defeat'};
}
};
Cookies相关配置
注:每一个域名都有自己对应的Cookies,如果两个域名同属于一个域名的二级域名
可以设置他们的domain为一级域名,这样两个二级域名都可以访问到一级域名的Cookies,实现在一级域名相同的情况下的Cookies的“跨域”操作
//cookie配置
const cookieConfig = {
domain: 'localhost', // 写cookie所在的域名
path: '/', // 写cookie所在的路径
maxAge: 1800000, // cookie有效时长
// expires: new Date('2017-02-15'), // cookie失效时间
httpOnly: false, // 是否只用于http请求中获取
overwrite: false // 是否允许重写
}
如果当前用户处于登录状态许访问后台接口,或者正在访问不需要登陆就可以访问的接口,则允许通过,否则不允许访问。
我们可以在一个访问进入路由前加一个简单的拦截器
const allowpage = ['/node/signin']//允许直接访问的接口
module.exports = function(ctx, next){
let url = ctx.originalUrl;
if(allowpage.indexOf(url)>-1){
console.log("正在登陆。。。");
}else if(ctx.session.userState){
console.log("正在访问接口:"+url);
}else{
console.log("session 已失效,请重新登录");
ctx.redirect(null);
}
};
删除session
/**
* 登出
* @author Shellcoochi
* @param ctx
* @param next
* @returns {Promise<void>}
*/
let fn_sign_out = async (ctx,next)=>{
if(ctx.session){
ctx.session =null;//清空session
ctx.response.body = {
state:'success',
msg:'登出成功'
}
console.log('登出成功')
}else{
ctx.response.body = {
state:'defeat',
msg:'session 已失效'
}
console.log("当前 session 已失效");
}
};
.png)
koa 实现session登陆的更多相关文章
- Cookie、Session登陆验证相关介绍和用法
一.Cookie和Session 首先.HTTP协议是无状态的:所谓的无状态是指每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应直接影响,也不会直接 ...
- .Net core 使用特性Attribute验证Session登陆状态
1.新建一个.net core mvc项目 2.在Models文件夹下面添加一个类MyAttribute,专门用来保存我们定义的特性 在这里我只写了CheckLoginAttribute用来验证登陆情 ...
- koa 基础(十六)koa 中 session 的使用
1.app.js /** * koa 中 session 的使用 * 1.npm install koa-session --save * 2.const session = require('koa ...
- session 登陆浏览,并实现session注销登陆
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- 装饰器实现session登陆 验证功能
装饰器 登陆验证功能 1.装饰器模板 from django.shortcuts import render, redirect, HttpResponse from django.conf impo ...
- PHP登陆Session验证
关键字:PHP Session 登陆 验证 本文地址:http://www.cnblogs.com/txw1958/p/php-login-check-session.html 首先,在MySQL数据 ...
- KoaHub平台基于Node.js开发的Koa的get/set session插件代码详情
koa-session2 Middleware for Koa2 to get/set session use with custom stores such as Redis or mongodb ...
- Koa Session的使用
Session 简单介绍 session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 session 保存在服务器上. Session 的工作流程 当浏览器访问服务器 ...
- Koa2学习(八)使用session
Koa2学习(八)使用session koa2框架不提供session的处理方法,这里我们需要借助一个第三方中间件koa-session来处理session. 先安装插件: $ npm i koa-s ...
随机推荐
- linux内核中rtc框架选用什么接口来注册rtc设备呢?
1. 有哪些接口? 1.1 devm_rtc_device_register 1.2 devm_rtc_allocate_device和 rtc_register_device 2. 1.1与1.2 ...
- ERS:百科
ylbtech-ERS:百科 ERS=(Enterprises Run System)企业运行系统 企业运行系统-ERS,是继ERP系统之后的企业管理控制软件系统的终极形式,有着非常美好的市场前景,尤 ...
- ubuntu下virtualbox的安装、卸载
一.添加VirtualBox的源并安装5.1版本 virtualbox官网:https://www.virtualbox.org/wiki/Download_Old_Builds 虽然也可以直接安装d ...
- [C++]数据结构:线性表之(单)链表
一 (单)链表 ADT + Status InitList(LinkList &L) 初始化(单)链表 + void printList(LinkList L) 遍历(单)链表 + int L ...
- 磁盘分区知识与linux系统分区实践
一.磁盘存储逻辑结构图 回忆: (1)什么是分区? 磁盘分区就相当于给磁盘打隔断. (2)磁盘在linux里的命名 IDE /dev/hda hdb SCSI sda sdb 分区 ...
- centos7服务搭建常用服务配置之一:SSH
目录 1 SSH服务协议 1.1 ssh服务协议说明 1.2 ssh服务工作机制 1.3 ssh加密技术说明 1.3.1 ssh实现安全链接建立,利用要是和锁头 1.3.2 ssh加密算法 1.4 s ...
- C# lambda查询带返回值
问题来源: <深入理解C#(第3版)> 11页 具体如下: var lists=new List<string>{"111","222" ...
- [Agc028B]Removing Blocks_排列组合
Removing Blocks 题目链接:https://atcoder.jp/contests/agc028/tasks/agc028_b 数据范围:略. 题解: 这种问题的第一步很套路,就是对于每 ...
- 测试sigaction重启动标识
#include <stdio.h>#include <unistd.h>#include <signal.h>#include <string.h># ...
- [转帖]Intel 上一代 可扩展CPU的简单报价
8.1万元人间毒物!Intel 28核铂金版Xeon 8180零售上市 http://news.mydrivers.com/1/541/541670.htm 猜你想看:英特尔 CPU处理器 Xeon ...