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

但是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. C之内存地址

    计算机的内存地址 * 32位系统最多能识别4G内存 * 32位系统的地址总线长度是32位的,也就是说能分配给内存地址的数字是 2的32次方个 * 内存中每一个字节都需要一个内存地址 * 一个数字对用一 ...

  2. wm_concat()函数

    转: Oracle wm_concat()函数 oracle wm_concat(column)函数使我们经常会使用到的,下面就教您如何使用oraclewm_concat(column)函数实现字段合 ...

  3. osg help

    #ifdef _WIN32#include <Windows.h>#endif // _WIN32 #include <osgViewer/Viewer>#include &l ...

  4. Spring Security(01)——初体验

    (注:本文是基于Spring Security3.1.6所写) (注:原创文章,转载请注明出处.原文地址:http://elim.iteye.com/blog/2154299) (注:本文是基于Spr ...

  5. Jmeter 逻辑控制器 之 Runtime Controller

    一.认识 Runtime Controller  控制其下样例执行的时间长度. 设置界面:  Runtime (seconds):运行时间,单位秒.即控制其下样例执行多长时间.与线程组中的调度器的持续 ...

  6. npm install, npm install -g, npm install --save, npm install --save-dev之间的区别

    1.npm install X 安装X到项目的node_modules文件夹 会修改package.json,在dependencies中写入依赖.(关于这一点,网上的大部分文章都是说,不会修改pac ...

  7. QFramework 使用指南 2020(五):脚本生成(3)生成 Prefab

    在上一篇,我们简单介绍了 ViewController 的嵌套实现. 在这一篇,我们学习 ViewController 脚本生成的最后一个功能,即:生成 Prefab. 实际上这个功能非常简单. 我们 ...

  8. Java基础——接口和抽象类

    接口(interface) 什么是接口? 接口时抽象方法的合集.接口不可以被直接被实例化. 为什么要使用接口? 为了扩展.Java不支持多继承,但是通过接口就可以实现“多继承” 制定规则.接口就是规则 ...

  9. manjaro-VM虚拟机vmmon错误

    1.安装AUR : vmware-systemd-serverices 2.启动服务: systemctl enable vmware.service systemctl start vmware.s ...

  10. HIVE配置mysql metastore

    HIVE配置mysql metastore    hive中除了保存真正的数据以外还要额外保存用来描述库.表.数据的数据,称为hive的元数据.这些元数据又存放在何处呢?    如果不修改配置hive ...