koa2学习笔记(六)学会使用session

Session原理

Session的原理其实还是依赖了Cookie,所以Cookie才是记录用户凭证的真理。它的原理大概是酱紫的:服务器端维护一个session的表,这个表的每一条记录存的就是与某一个客户端的会话,会话会有过期时间,过期的会话会被清理。然后这个会话,会有一个对应的id,一般是一串长长的看不懂的字符串,然后这个字符串会被存储在客户端的cookie中,每一次请求服务器端都会带上这个cookie,服务器端就知道访问的就是哪个客户端了。

使用koa-session

koa2框架不提供session的处理方法,这里我们需要借助一个第三方中间件koa-session来处理session。

app.js

const Koa = require('koa')
const app = new Koa()
const session = require('koa-session')
app.keys = ['secret']   // session加密字段
app.use(session({
    key: 'koa:sess', //cookie key (default is koa:sess)
    maxAge: 86400000, // cookie的过期时间 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))
app.use(ctx => {
    // ignore favicon
    if (ctx.path === '/favicon.ico') return
    console.log(ctx.session)
    let n = ctx.session.views || 0
    ctx.session.views = ++n
    ctx.body = n + ' views'
});
app.listen(8000)

复制代码
  • 这个ctx.session是针对某一个浏览器用户的。

  • 不断地刷新访问浏览器,浏览器上显示的访问次数会增加。

  • 如果不使用数据库,session是保存在内存中的。在服务端通常会使用redis等方案来使session持久化。

现在我们来模拟一个简单的登陆:

const Koa = require('koa')
const app = new Koa()
const session = require('koa-session')
app.keys = ['secret']   // session加密字段
app.use(session({}, app))

app.use(async (ctx, next) => {
    if (ctx.url === '/login') {
        ctx.session.user_name = 'zhangsan'
        ctx.body = {
            msg: '登录成功'
        }
    }
    await next()
})
app.use(async (ctx, next) => {
    if (ctx.url === '/logout') {
        ctx.session = null
        ctx.body = {
            msg: '退出成功'
        }
    }
    await next()
})
app.use(async ctx => {
    console.log(ctx.session)
    if (ctx.url === '/index') {
        if (ctx.session.user_name === 'zhangsan') {
            ctx.body = {
                msg: '成功匹配到用户zhangsan'
            }
        } else {
            ctx.body = {
                msg: '登陆验证失败'
            }
        }
    }
})
app.listen(8000)
复制代码

一个最简单的session登录就实现了。下面是我写的一个登录注册demo登录注册

github地址是github.com/qz9527/koa2,如果觉得有用的话,欢迎star。

小强前端交流群QQ群:724179055

定时分析技术和资料,欢迎大家进来一起交流。

往期回顾地址:

  • koa2学习笔记(一) 环境搭建

  • koa2学习笔记(二) koa-router路由高级技巧

  • koa2学习笔记(三) async/await详解

  • koa2学习笔记(四) GET/POST请求讲解

  • koa2学习笔记(五) Cookie使用

  • koa2学习笔记(六) 学会session登录

  • koa2学习笔记(七) koa-jwt鉴权

  • koa2学习笔记(八) koa全局异常处理

你可能感兴趣的:(前端,数据库)