在我们访问一些网站内部内容的时候,通常都会先验证我们是否已经登陆,如果登陆了就跳转到内容页面否则就跳转或者弹出登陆页面。

但是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 已失效");
}
};

koa 实现session登陆的更多相关文章

  1. Cookie、Session登陆验证相关介绍和用法

    一.Cookie和Session 首先.HTTP协议是无状态的:所谓的无状态是指每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应直接影响,也不会直接 ...

  2. .Net core 使用特性Attribute验证Session登陆状态

    1.新建一个.net core mvc项目 2.在Models文件夹下面添加一个类MyAttribute,专门用来保存我们定义的特性 在这里我只写了CheckLoginAttribute用来验证登陆情 ...

  3. koa 基础(十六)koa 中 session 的使用

    1.app.js /** * koa 中 session 的使用 * 1.npm install koa-session --save * 2.const session = require('koa ...

  4. session 登陆浏览,并实现session注销登陆

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  5. 装饰器实现session登陆 验证功能

    装饰器 登陆验证功能 1.装饰器模板 from django.shortcuts import render, redirect, HttpResponse from django.conf impo ...

  6. PHP登陆Session验证

    关键字:PHP Session 登陆 验证 本文地址:http://www.cnblogs.com/txw1958/p/php-login-check-session.html 首先,在MySQL数据 ...

  7. 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 ...

  8. Koa Session的使用

    Session 简单介绍 session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 session 保存在服务器上. Session 的工作流程 当浏览器访问服务器 ...

  9. Koa2学习(八)使用session

    Koa2学习(八)使用session koa2框架不提供session的处理方法,这里我们需要借助一个第三方中间件koa-session来处理session. 先安装插件: $ npm i koa-s ...

随机推荐

  1. <JavaScript> 匿名函数和闭包的区别

    匿名函数:没有名字的函数:并没有牵扯到应用其他函数的变量问题.仅仅是没有名字. 定义方式: 1,var A = function(){ }; 2, (function (x,y){ })(2,3); ...

  2. SpringBoot 2.x中为tomcat配置ssl(https)支持

    参考来源:https://www.cnblogs.com/imfjj/p/9058443.html https://blog.csdn.net/jackymvc/article/details/810 ...

  3. webdriver(chrome无头浏览器)

    '''chrome无头浏览器''' from selenium.webdriver.chrome.options import Options # 导入相应的类 from selenium impor ...

  4. Vue Cli 3 初体验(全面详解)

    vue新出了 vue cli 3,并直接改名为 @vue/cli,今天就来盘他. 首先介绍等啰里啰嗦的就不写了,贴个link吧. Vue CLi3 github Vue CLi web 要是想先了解下 ...

  5. 基于LSTM + keras 的诗歌生成器

        最近在github 上发现了一个好玩的项目,一个基于LSTM + keras 实现的诗歌生成器,地址是:https://github.com/youyuge34/Poems_generator ...

  6. Docker三

    将本地镜像发布到阿里云 有时候需要共享镜像或者习惯使用自己定义的镜像,可以注册私有仓库,国内推荐使用阿里云 步骤: 1.登录阿里云容器镜像服务:https://cr.console.aliyun.co ...

  7. 解决zabbix中文乱码问题

    进入Windows系统控制面板-->外观和个性化-->字体(选择一个字体文件simsun.ttc复制)进入zabbix的web服务器[root@test-zabbix]# cd ~/zab ...

  8. MFC中使用ADO进行数据库操作

    参考FROM:http://hi.baidu.com/sunkanghome/item/e1fda510b3186359f1090ee2 数据库与数据库编程: 当前各种主流数据库有很多,包括Oracl ...

  9. JAVA连接Sql-Server教程

    一.下载相应的版本的jar文件(官网:https://docs.microsoft.com/zh-cn/sql/connect/jdbc/system-requirements-for-the-jdb ...

  10. 最新 浪潮java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.浪潮等10家互联网公司的校招Offer,因为某些自身原因最终选择了浪潮.6.7月主要是做系统复习.项目复盘.LeetCode ...