koa 中使用 session

Session:

session 是另一种记录客户端状态的机制,不同的是 Cookie 保存在客户端的浏览器中,而 session 保存在服务器上。

session 工作流程:

  当浏览器访问服务器并发送第一次请求时,服务端会创建一个 session 对象,生成一个类似于 key,value的键值对,然后将 key(cookie)返回到浏览器(客户端),浏览器下次再访问时,携带 key(cookie),找到对应的 session(value),客户的信息都保存在 session 中。

koa-session 的使用:

安装 koa-session   npm install koa-session --save

引入配置 koa-session:

https://www.npmjs.com/package/koa-session

koa 中使用 session

设置 session:ctx,session.userName = “张三”

获取 session值:ctx.session.userName

const session = require('koa-session');
const Koa = require('koa');
const router = require('koa-router')();
const app = new Koa();
const render = require('koa-art-template')
const path = require('path')

//配置koa-art-template模板引擎
render(app,{
    root: path.join(__dirname, 'views'),   // 视图的位置
    extname: '.html',  // 后缀名
    debug: process.env.NODE_ENV !== 'production'  //是否开启调试模式
})

//配置koa-session
app.keys = ['some secret hurr']; //cookie的签名
const CONFIG = {
    key: 'koa:sess', /** (string) cookie key (default is koa.sess) */
    maxAge: 86400000, //cookie的过期时间,默认24h
    autoCommit: true, /** (boolean) automatically commit headers (default true) */
    overwrite: true, /** 默认为true */
    httpOnly: true, /** true表示只有服务器端可以获取cookie */
    signed: true, /** 默认 签名 */
    rolling: false, /** 在每次请求时强行设置 cookie,这将重置 cookie 过期时间(默认:false)  */
    renew: false, /** (boolean) renew session when session is nearly expired, so we can always keep user logged in. (default is false)*/
    secure: false, /** (boolean) secure cookie,默认是true,服务器开启了Https时,cookie的Secure属性应设为true*/
    sameSite: null, /** (string) session cookie sameSite options (default null, don't set it) */
};

app.use(session(CONFIG, app));

router.get('/',async (ctx)=>{
    //获取session
    console.log("首页获取session:",ctx.session.userName)
    await ctx.render('index')
})
router.get('/login', async (ctx) => {
    //设置session
    ctx.session.userName='李华'
    await ctx.render('login')
})
router.get('/list', async (ctx) => {
    //获取session
    console.log("列表页获取session:", ctx.session.userName)
    await ctx.render('list')
})

app.use(router.routes());  
app.use(router.allowedMethods());
app.listen(3000);

第一次进入首页,获取的 session值是 undefined,进入login登录页,设置了 session后,再次进入列表页和首页,可以获取 session的值:

koa 中使用 session

Cookie和Session 的区别:

① cookie 数据存放在客户的浏览器上,session 数据放在服务器上

② cookie 不是很安全,别人可以分析存放在本地的 cookie 并进行 cookie 欺骗,考虑到安全应当使用 session

③ session 会在一定时间内保留在服务器上,当访问增多,会比较占用服务器的性能,考虑到减轻服务器性能方面,应当使用 cookie

④ 单个 cookie 保存的数据不能超过 4k,很多浏览器都限制一个站点最多保存 20个 cookie