Appearance
koa-session
简介
koa-session是一个用于管理会话的 Koa 中间件,它提供了一种在服务器端存储用户会话数据的方式,支持多种存储引擎,包括内存存储和外部存储(如 Redis)。
安装
bash
npm install koa-session基本使用
javascript
const Koa = require('koa');
const session = require('koa-session');
const app = new Koa();
// 配置 session 中间件
app.keys = ['some secret hurr']; // 用于签名的密钥
const CONFIG = {
key: 'koa.sess', // cookie 键名
maxAge: 86400000, // cookie 的过期时间 (ms)
autoCommit: true, // 自动提交 headers
overwrite: true, // 是否允许重写
httpOnly: true, // 是否仅允许服务器访问 cookie
signed: true, // 是否签名 cookie
rolling: false, // 是否每次响应时刷新 session 的有效期
renew: false, // 是否在 session 快过期时更新
};
app.use(session(CONFIG, app));
// 使用示例
app.use(async ctx => {
// 获取 session
let n = ctx.session.views || 0;
// 设置 session
ctx.session.views = ++n;
ctx.body = `第 ${n} 次访问`;
});
app.listen(3000);外部存储配置
javascript
const session = require('koa-session');
const Redis = require('ioredis');
const redis = new Redis();
// 自定义存储
class RedisStore {
async get(key) {
const data = await redis.get(key);
return JSON.parse(data);
}
async set(key, value, maxAge) {
await redis.set(key, JSON.stringify(value), 'PX', maxAge);
}
async destroy(key) {
await redis.del(key);
}
}
app.use(session({
...CONFIG,
store: new RedisStore()
}, app));配置选项
key: cookie 的名称maxAge: session 的过期时间autoCommit: 是否自动提交 headersoverwrite: 是否允许重写httpOnly: 是否仅允许服务器访问 cookiesigned: 是否签名 cookierolling: 是否每次响应时刷新 sessionrenew: 是否在 session 快过期时更新store: 自定义存储引擎valid: 自定义验证器beforeSave: 保存前的钩子函数
注意事项
- 必须设置 app.keys 用于签名
- 生产环境建议使用外部存储(如 Redis)
- 合理设置 session 的过期时间
- 注意 session 数据的大小,避免存储过大的数据
- 考虑使用 HTTPS 来保护 session cookie
- 在分布式系统中必须使用外部存储来共享 session