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

但是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. 强悍的Python读取大文件的解决方案

    这是一道著名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适合读取大文件. 1. read() 接口的问题 f =open(filename, ...

  2. GPS模块编程之NMEA0183协议

    NMEA 0183是美国国家海洋电子协会(National Marine Electronics Association)为海用电子设备制定的标准格式.现在已经成为GPS导航设备统一的RTCM(Rad ...

  3. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_02-freemarker介绍

  4. double,float,BigDecimal类型数值的操作

    float四舍五入保留两位小数 /** * float四舍五入保留两位小数 * */ public static float formatDecimal(float n) { return (Math ...

  5. 开发CLI命令行

    命令行工具:CLI 是在命令行终端使用的工具,如git, npm, vim 都是CLI工具.比如我们可以通过 git clone 等命令简单把远程代码复制到本地 和 cli 相对的是图形用户界面(gu ...

  6. 使用xhprof进行线上PHP性能追踪及分析

    转自: http://avnpc.com/pages/profiler-php-performance-online-by-xhprof

  7. golang web框架设计5:配置设计

    配置信息的解析,实现的是一个key=value,键值对的一个配置文件,类似于ini的配置格式,然后解析这个文件,把解析的数据保存到map中,最后调用的时候通过几个string,int之类的函数返回相应 ...

  8. centos7:ssh免密登陆设置

    1.使用root用户登录,进入到目录/root/.ssh 2.执行命令:ssh-keygen -t rsa 一路回车,完成后会在目录/root/.ssh下面生成文件 id_rsa和id_rsa.pub ...

  9. CJL.0.1.js

    /*! * Cloudgamer JavaScript Library v0.1 * Copyright (c) 2009 cloudgamer * Blog: http://cloudgamer.c ...

  10. 34.TCP非阻塞连接及套接字异常处理丶端口扫描脚本

    TCP非阻塞及套接字异常处理: TCP阻塞套接字异常捕获: 套接字创建失败,8000 socket.error 客户端连接错误: ConnectionRefusedError socket.gaier ...