koa session的使用方式,官网给的例子
const session = require('koa-session');
const Koa = require('koa');
const app = new Koa();
app.keys = ['some secret hurr'];
const CONFIG = {
key: 'koa.sess', /** (string) cookie key (default is koa.sess) */
/** (number || 'session') maxAge in ms (default is 1 days) */
/** 'session' will result in a cookie that expires when session/browser is closed */
/** Warning: If a session cookie is stolen, this cookie will never expire */
maxAge: 86400000,
autoCommit: true, /** (boolean) automatically commit headers (default true) */
overwrite: true, /** (boolean) can overwrite or not (default true) */
httpOnly: true, /** (boolean) httpOnly or not (default true) */
signed: true, /** (boolean) signed or not (default true) */
rolling: false, /** (boolean) Force a session identifier cookie to be set on every response. The expiration is reset to the original maxAge, resetting the expiration countdown. (default is false) */
renew: false, /** (boolean) renew session when session is nearly expired, so we can always keep user logged in. (default is false)*/
secure: true, /** (boolean) secure cookie*/
sameSite: null, /** (string) session cookie sameSite options (default null, don't set it) */
};
app.use(session(CONFIG, app));
// or if you prefer all default config, just use => app.use(session(app));
app.use(ctx => {
// ignore favicon
if (ctx.path === '/favicon.ico') return;
let n = ctx.session.views || 0;
ctx.session.views = ++n;
ctx.body = n + ' views';
});
app.listen(3000);
console.log('listening on port 3000');
按这个例子是最简单的工作机制,session的内容,包括配置都会存于cookie中,
使用这种方案的优点:
1.简单,服务端无需做任何存储,只需要做序列化和反序列化
2.方案支持无需做任何处理就是支持分布式,集群
缺点:
每个请求都需要携带所有数据,session缓存的数据太大就会有额外负担,要控制session的大小
其他可能的session需求
1.需要同个账号,后面登录的覆盖前面的,做到同个账号只允许一处登录
答:这个功能可以不需要改session,重新在程序做个map存储在线用户,加多一层判断做处理,如果需要支持集群,则使用redis维护map
2.同个浏览器支持多账号登录使用
答:采用cookie的session方案,在同浏览器,同域名路径下,只能存在一个同名cookie值的天然特性,使得该需求做不了,
解决方案只能是放弃cookie方案,采用信息存储在其他的头字段,然后客户端配合把session手动每次提交上去;这种改动对于那些原先
使用<img>标签src的图片,图片又是需要需要认证,都会产生影响。
3.如何获取非当前用户的session信息
答:按官方默认cookie机制的seesion是没办法拿到的,需要自己写程序记录或是扩展session
koa-session的扩展主要支持3个配置:
1.ContextStore,一个存储类,告诉koa-session如何get,set,destroy对应获取,设置,删除
2.store,一个存储实例,告诉koa-session如何get,set,destroy;store跟ContextStore只要存在一个即可,作用是一样的
3.externalKey,一个生成全局唯一键的函数,默认是uuid.v4,一般不建议改