5. cookie/session - 5.2 koa2实现session

优质
小牛编辑
124浏览
2023-12-01

前言

koa2原生功能只提供了cookie的操作,但是没有提供session操作。session就只用自己实现或者通过第三方中间件实现。在koa2中实现session的方案有一下几种

  • 如果session数据量很小,可以直接存在内存中
  • 如果session数据量很大,则需要存储介质存放session数据

数据库存储方案

  • 将session存放在MySQL数据库中
  • 需要用到中间件
    • koa-session-minimal 适用于koa2 的session中间件,提供存储介质的读写接口 。
    • koa-mysql-session 为koa-session-minimal中间件提供MySQL数据库的session数据读写操作。
    • 将sessionId和对于的数据存到数据库
  • 将数据库的存储的sessionId存到页面的cookie中
  • 根据cookie的sessionId去获取对于的session信息

快速使用

demo源码

https://github.com/ChenShenhai/koa2-note/blob/master/demo/session/index.js

例子代码

  1. const Koa = require('koa')
  2. const session = require('koa-session-minimal')
  3. const MysqlSession = require('koa-mysql-session')
  4. const app = new Koa()
  5. // 配置存储session信息的mysql
  6. let store = new MysqlSession({
  7. user: 'root',
  8. password: 'abc123',
  9. database: 'koa_demo',
  10. host: '127.0.0.1',
  11. })
  12. // 存放sessionId的cookie配置
  13. let cookie = {
  14. maxAge: '', // cookie有效时长
  15. expires: '', // cookie失效时间
  16. path: '', // 写cookie所在的路径
  17. domain: '', // 写cookie所在的域名
  18. httpOnly: '', // 是否只用于http请求中获取
  19. overwrite: '', // 是否允许重写
  20. secure: '',
  21. sameSite: '',
  22. signed: '',
  23. }
  24. // 使用session中间件
  25. app.use(session({
  26. key: 'SESSION_ID',
  27. store: store,
  28. cookie: cookie
  29. }))
  30. app.use( async ( ctx ) => {
  31. // 设置session
  32. if ( ctx.url === '/set' ) {
  33. ctx.session = {
  34. user_id: Math.random().toString(36).substr(2),
  35. count: 0
  36. }
  37. ctx.body = ctx.session
  38. } else if ( ctx.url === '/' ) {
  39. // 读取session信息
  40. ctx.session.count = ctx.session.count + 1
  41. ctx.body = ctx.session
  42. }
  43. })
  44. app.listen(3000)
  45. console.log('[demo] session is starting at port 3000')

运行例子

执行命令

  1. node index.js

访问连接设置session

http://localhost:3000/set
session-result-01

查看数据库session是否存储

session-result-01

查看cookie中是否种下了sessionId

http://localhost:3000
session-result-01