Session的原理其实仍是依赖了Cookie,因此Cookie才是记录用户凭证的真理。它的原理大概是酱紫的:服务器端维护一个session的表,这个表的每一条记录存的就是与某一个客户端的会话,会话会有过时时间,过时的会话会被清理。而后这个会话,会有一个对应的id,通常是一串长长的看不懂的字符串,而后这个字符串会被存储在客户端的cookie中,每一次请求服务器端都会带上这个cookie,服务器端就知道访问的就是哪一个客户端了。前端
koa2框架不提供session的处理方法,这里咱们须要借助一个第三方中间件koa-session来处理session。git
app.jsgithub
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是针对某一个浏览器用户的。redis
不断地刷新访问浏览器,浏览器上显示的访问次数会增长。数据库
若是不使用数据库,session是保存在内存中的。在服务端一般会使用redis等方案来使session持久化。浏览器
如今咱们来模拟一个简单的登录:bash
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。cookie
小强前端交流群QQ群:724179055session
定时分析技术和资料,欢迎你们进来一块儿交流。
往期回顾地址: