Express未返回Session ID仍识别客户端的会话原理疑问
解答
哈哈,其实你没注意到,Express-session默认是靠HTTP Cookie来传递会话标识的,整个过程完全自动,不需要你手动处理Session ID的返回:
- 当客户端第一次发请求过来时,Express-session会生成一个唯一的会话ID,把这个ID和对应的会话数据存在你配置的MongoDB存储里,同时会在响应头里加一个
Set-Cookie字段,把会话ID打包成Cookie发给浏览器。 - 浏览器收到这个Cookie后,会按照你设置的
maxAge(这里是1周)把它存在本地。就算你关掉浏览器,只要Cookie没过期,下次打开浏览器再发请求时,浏览器会自动把这个Cookie放到请求头里一起发给服务器。 - 服务器拿到请求后,会从Cookie里取出会话ID,然后去MongoDB里找对应的会话对象,这样
req.session就能恢复之前保存的用户ID等信息了。
再结合你的配置说两个关键点:
- 你设置的
cookie.maxAge决定了这个会话Cookie的有效期,1周的时间足够长,所以关闭浏览器后Cookie不会立刻消失,下次请求还能用上。 saveUninitialized: true的作用是,哪怕客户端还没完成认证,第一次请求时服务器就会创建会话并发送Cookie,这也是后续能恢复会话的前提。
说白了,Cookie就是客户端和服务器之间的"隐形身份证",Express-session已经帮你把生成、发送、存储、验证这些步骤都封装好了,所以你才感觉不到Session ID的存在~
内容的提问来源于stack exchange,提问作者Jaro
相关产品推荐
相关产品推荐

