2026-06-09 修复 Session 和 Cookie 设计缺陷
P0 严重问题修复
内存模式 Session 不工作:原代码每次请求
Dim Session As New cHttpServerSession创建全新对象,无全局存储,请求间数据完全丢失。新增m_Sessions As Dictionary全局字典,内存模式直接引用存取。请求/响应 Cookie 混淆:原
Cookies.Decode()将请求 Cookie 存入Data,Encode()又把所有 Cookie(含请求带入的)回写为Set-Cookie,导致每次请求重发所有 Cookie。拆分为m_RequestCookies(只读,来自浏览器)和Data(响应 Cookie,写回浏览器)。新增GetValue(Key)读取请求 Cookie,Cookie(Key)仅用于设置响应 Cookie。首次写入 Session 数据丢失:原代码仅
SessionID <> ""时才保存,但SessionID是懒加载的——用户只写Session.Item("k")="v"而不读SessionID时,ID 未生成,数据丢失。现Item Let/Set时自动生成 SessionID。
P1 中等问题修复
每次请求都持久化:新增
Dirty标记,Item Let/Set、Remove、Clear、Abandon时置 True,仅Dirty=True时才执行文件 I/O 或数据库写入。Session 过期清理缺失:新增
CleanupExpiredSessions方法,支持内存/文件/数据库三种模式清理。加载 Session 时发现过期立即删除,同时SessionAutoCleanup=True时约 1% 概率自动触发清理。Cookie 删除功能缺失:新增
ExpireCookie(Key)方法,设置Expires = 昨天通知浏览器删除指定 Cookie。
P2 安全与优化
SameSite 默认值:Session Cookie 默认设置
SameSite=Lax,防止 CSRF。Session 序列化类型安全:
Serialize()跳过IsObject类型的值,避免序列化对象引用报错。SessionID 去花括号:
GenerateSessionID去掉 GUID 的{},Cookie 值更紧凑。Clear vs Abandon 语义:
Clear()只清数据保留 SessionID(Cookie 不失效),Abandon()才重新生成 ID 并标记 Dirty。
API 变更提示
- 读取请求 Cookie:
ctx.Cookies.GetValue("name")(不创建响应 Cookie) - 设置响应 Cookie:
ctx.Cookies.Cookie("name").Value = "x"(同前) - 删除浏览器 Cookie:
ctx.Cookies.ExpireCookie("name")