ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Midway Session 组件完全指南:从 Cookie Session 到自定义 Session Store 的落地实践

2026/9/28 6:25:11 拓冰建站 浏览量
Midway Session 组件完全指南:从 Cookie Session 到自定义 Session Store 的落地实践 后端微服务云原生【免费下载链接】midway A Node.js Serverless Framework for front-end/full-stack developers. Build the application for next decade. Works on AWS, Alibaba Cloud, Tencent Cloud and traditional VM/Container. Super easy integrate with React and Vue. 项目地址https://gitcode.com/gh_mirrors/mi/midway点击查看免费下载本文以midwayjs/session组件位于 packages/session为主体系统讲解在 MidwayKoa / FaaS应用中启用与配置 Session 的完整路径默认配置、可继承的 koa-session 全量参数、以及通过实现抽象类SessionStore接入自定义存储的实战方案。读完本文你将能够开箱即用地完成用户会话读写、理解底层ctx.session的存取与自动提交机制并在 Redis、MySQL 等外部存储中落地自己的 Session Store。组件定位与适用场景midwayjs/session是 Midway 官方为midwayjs/koa与midwayjs/faas提供的 Session 组件。它的核心职责是将 Session 能力挂载到请求上下文提供ctx.session/ctx.sessionOptions访问入口见 middleware/session.ts默认使用Cookie 直存模式Session 数据经 Base64 JSON 编码写入 Cookie体积小、免存储依赖支持通过自定义SessionStore切换为外部存储模式数据存放在 Redis、数据库等Cookie 中只保存一个会话 ID 外键自动监听会话缺失missed、过期expired、非法invalid等事件并输出日志。组件内部依赖midwayjs/cookies完成 Cookie 的读写与签名相关声明可见 package.json。安装与接入安装命令$ npm i midwayjs/session --save接入方式分两种框架midwayjs/koa默认已启用该组件无需额外配置即可使用midwayjs/faas需要手动启用在src/configuration.ts中将其加入imports// src/configuration.ts import { join } from path; import * as faas from midwayjs/faas; import * as session from midwayjs/session; Configuration({ imports: [ faas, session, ], // ... }) export class ContainerLifeCycle implements ILifeCycle {}组件通过 configuration.ts 中的SessionConfiguration完成装配在onReady阶段读取session配置若enable为真则向所有 koa/faas 应用注册SessionMiddleware并挂载session:missed、session:expired、session:invalid三个事件的日志监听。默认配置与完整参数说明在config.*.ts中通过session配置项进行定制。组件的默认配置位于 config/config.default.ts实际默认值如下export const session { enable: true, maxAge: 24 * 3600 * 1000, // ms即 1 天 key: MW_SESS, httpOnly: true, // sameSite: null, logValue: true, };参数说明参数默认值说明enabletrue是否启用 Session 中间件关闭后ctx.session不再注入maxAge24 * 3600 * 1000毫秒Session 有效期。注意代码注释中的 Cookie key 默认名与默认配置存在历史差异实际生效值为MW_SESS测试 index.test.ts 中同样以MW_SESS断言keyMW_SESS存放会话的 Cookie 名httpOnlytrue禁止客户端 JavaScript 读取 Cookie若设置为false中间件会在启动时输出安全警告sameSitenull不设置默认删除空值需要时可按koa-session语义显式配置lax/strict/nonelogValuetrue会话过期/非法时是否在session:expired/session:invalid日志中打印会话内容可继承的 koa-session 全量选项README 明确指出“you can use all config from koa-session”这些选项在 interface.ts 的SessionOptions中有完整类型定义并在 middleware/session.ts 的formatOpts中被逐一校验、赋默认值。常用项如下maxAge除了毫秒数值还可设置为session表示会话级 Cookie浏览器/会话关闭即失效底层在save时会写入_session: true标记并清空maxAge同时跳过_expire字段见 lib/context.tsrolling默认false每次响应都强制重写会话 Cookie重置过期倒计时适合“持续活跃即续期”的场景renew默认false会话在剩余寿命不足maxAge / 2时自动续期用于“长期保持登录”genid外部存储模式下生成会话 ID 的函数默认Utils.randomUUID若配置了prefix则生成prefix UUIDprefix外部会话 ID 的统一前缀genid存在时忽略externalKey自定义“外部键”的get/set方法默认从opts.key对应的 Cookie 中读取ContextStore需要从ctx获取依赖的存储类每个请求执行一次new ContextStore(ctx)需实现get/set/destroy三个实例方法valid(ctx, session)读取到会话值后、使用前的校验钩子返回false即触发session:invalid事件并重建会话beforeSave(ctx, session)会话落盘前的钩子可在此做数据加工autoCommit默认true请求结束后是否自动提交会话设为false时需手动调用ctx.session.manuallyCommit()overwrite/signedCookie 覆盖写入与签名默认均为trueencode/decode自定义 Cookie 内容的编解码函数默认实现见 lib/util.tsJSON.stringify后转 Base64读取时反向解码。配置校验逻辑集中在 middleware/session.ts 的formatOptsstore必须提供get/set/destroyexternalKey必须提供get/setContextStore必须是具备上述三方法的类否则启动时直接断言报错。使用方式Cookie Session 模式在不配置任何 Store 的情况下Session 数据直接存入MW_SESSCookieBase64 编码的 JSON。控制器中读写如下import { Controller, Get } from midwayjs/core; Controller(/) export class HomeController { Get(/set) async set(ctx) { ctx.session.foo bar; // 写入会话 return ctx.session; } Get(/get) async get(ctx) { return ctx.session; // 读取会话未写数据时不产生 Set-Cookie } Get(/remove) async remove(ctx) { ctx.session null; // 置空即删除会话响应 204 并清除 Cookie } }ctx.session对象的能力由 lib/session.ts 中的Session类提供ctx.session.key value写入、直接读取即取值ctx.session.maxAge 100动态修改有效期修改后会强制落盘_requireSave truectx.session.regenerate(callback?)重新生成会话先删除旧会话再生成新外部键ctx.session.save(callback?)无论会话是否有数据都强制保存ctx.session.manuallyCommit()配合autoCommit: false手动提交session.length/session.populated判断会话是否已有数据session.externalKey仅外部存储模式下存在返回当前会话的存储键。底层流程在 lib/context.ts 中中间件首次访问ctx.session时按需initFromCookie()解析、valid校验、失败则重建响应阶段由中间件的finally块调用commit()通过 lib/util.ts 的 CRC32 哈希对比判断会话是否变更未变更且未开启rolling/renew时跳过写 Cookiectx.session null则触发remove()以 1970 年过期时间清除 Cookie。上述行为均有对应测试覆盖见 test/index.test.ts。自定义 Session Store接入外部存储当会话数据较大或需要跨进程共享多实例部署、Serverless 场景时应切换到外部存储模式。第一步继承SessionStore抽象类在 interface.ts 中定义了抽象类需要实现三个方法import { SessionStore } from midwayjs/session; Provide() Scope(ScopeEnum.Singleton) export class MemorySessionStore extends SessionStore { sessions {}; async get(key) { return this.sessions[key]; } async set(key, value) { this.sessions[key] value; } async destroy(key) { this.sessions[key] undefined; } }注意抽象类的方法签名见 interface.tsexport abstract class SessionStore { abstract get(key: string); abstract set(key: string, value: string, maxAge: number); abstract destroy(key); }set的第三个参数maxAge用于让 Redis 等支持 TTL 的存储自动过期底层在落盘时会额外1000010 秒以保证存储先于 Cookie 过期见 lib/context.ts 的save方法存储中会写入_expire、_maxAge或_session内部字段读取时由Session构造器还原maxAge实现类需标记为Provide()的单例供容器注入。第二步通过SessionStoreManager注入到组件SessionStoreManager见 lib/store.ts是单例管理器提供setSessionStore/getSessionStore。中间件在resolve阶段会取出管理器中的 Store 并写入sessionConfig.store见 middleware/session.ts。接入方式import { MemorySessionStore } from ./store; import * as session from midwayjs/session; Configuration({ imports: [ koa, session, ], //... }) export class AutoConfiguration { Inject() memoryStore: MemorySessionStore; Inject() sessionStoreManager: session.SessionStoreManager; async onReady() { this.sessionStoreManager.setSessionStore(this.memoryStore); } }切换到外部存储后Cookie 中不再保存完整会话数据而是只保存由genid生成的会话 ID默认 UUID会话数据以该 ID 为键写入 Store。仓库中的 memory-session 测试用例 就是这一模式的最小可运行示例。会话事件与日志排查ContextSession在会话读取异常时通过emit触发应用级事件lib/context.ts组件在 configuration.ts 中统一监听并输出 warn 日志session:missed会话键在存储中不存在session:expired_expire早于当前时间判定过期session:invalidvalid钩子校验失败。expired/invalid的日志内容是否打印由logValue配置控制生产环境若担心敏感信息泄漏可设为false。总结与选型建议单机、会话数据小使用默认的 Cookie Session零配置即可用注意 Cookie 大小上限约 4KB多实例、会话共享、数据量大实现SessionStore如基于ioredis的 Redis Store配合maxAge的 TTL 参数实现自动过期并开启rolling或renew控制续期策略安全基线保持httpOnly: truekey使用不易猜测的名称会话写 Cookie 依赖的签名密钥需妥善管理。本文所涉源码均可从仓库对应路径继续深入阅读默认配置、选项类型定义、中间件与参数校验、会话上下文管理、会话模型、Store 管理器 以及 功能测试。赞分享后端微服务云原生【免费下载链接】midway A Node.js Serverless Framework for front-end/full-stack developers. Build the application for next decade. Works on AWS, Alibaba Cloud, Tencent Cloud and traditional VM/Container. Super easy integrate with React and Vue. 项目地址https://gitcode.com/gh_mirrors/mi/midway点击查看免费下载相关推荐Presto Session Properties 完全指南从 SET SESSION 到源码级调优实践Presto Session Properties 完全指南从 SET SESSION 到源码级调优实践 导读 本文以 properties session.大数据数据库后端RuoYi-Cloud 数据库设计规范RuoYi Cloud 数据库设计规范 前言 在微服务架构中良好的数据库设计是系统稳定性和可扩展性的基石。RuoYi Cloud作为基于Spring Clou认证鉴权后端Yii 2 会话与 Cookie 完全指南从 $_SESSION 到组件化 Session/Cookie 的实战与源码解析Yii 2 会话与 Cookie 完全指南从 $_SESSION 到组件化 Session/Cookie 的实战与源码解析 Sessions会话与 Coo后端Web框架上一篇如何永久保存微信聊天记录WeChatMsg免费工具完整指南下一篇wechat-bot10 分钟搭好一个微信机器人多 AI 自动回复 群聊分析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考