Express 的 session 中间件 sessionID 问题
文章目录
session 中间件里的 sessionID(以下简称sid)的算法为 24byte 的全随机。sid 重复的可能性比较小,但理论上还是有重复的可能。
session 中间件的 session 维护流程为:
新 session 的创建
- 将 option 里配的 sessionStore 挂到 req 上;
- 修改
res.end
函数,在原函数基础上加入req.session.save
操作,就是往 sessionStore 里存 session; - 新 session 的接入,因为是新 session,所以 cookie 里没有 sid 信息。随机一个 sid,以此 sid 来创建 session,然后将 session 绑到 req 上;然后将 req 和 res 交给下个中间件或流程处理。
旧 session 接入
- 同上边的第 1 步;
- 同上边的第 2 步;
- cookie 里有 sid,根据这个 sid 去 sessionStore 里取回 session 信息;如果 session 过期就取不到 session了,就像上边的第 3 步里那样重新创建一个 session。
为了完全消除 sid 的重复性带来的影响,就要检查新创建的 sid 是否已经存在与 sessionStore 里了。
session 中间件的结构在 Express 的以后版本中还会修改,所以我不想动 session 中间件的源码。于是只能在新 session 创建后的我自己的逻辑流程中来处理。逻辑流程中,当 HTTP 包为登陆验证包时,将 session 中间件给创建的 session 的 sid 拿到 sessionStore 里去查下是否已被使用,如果使用就干掉当前 session,并通知当前客户端重试。
干掉当前 session 有个技巧,就是直接 req.session=null;
这样即可,因为修改后的 res.end
里,判断如果 req.session
未定义,就不会再去调用 req.session.save
了。当前 session 是一定不能让他 save
的,否则就拿当前用户的信息覆盖了之前用此 sid 的用户,造成那个用户后续逻辑混乱。