Express post请求后session为undefined 浏览器存在connect.sidCookie原因排查
问题原因拆解
1. 为什么注释session赋值代码后,req.session.usertest返回undefined,但浏览器仍保留connect.sid
浏览器本地Cookie和服务端session存储是两套完全独立的存储体系:
- 浏览器端的
connect.sid只要没到过期时间、没被用户手动删除,就会一直保存在本地,每次同域请求都会自动携带,服务端是否存储对应session、是否使用该sid完全不影响浏览器本地已有的Cookie值 - 你的配置中
saveUninitialized: false,意思是未被修改过的空session不会被持久化到服务端存储。你注释掉req.session.usertest = "testsession_hardcodedvaluefornow"这行代码后,没有对session做任何自定义修改,服务端收到请求时哪怕拿到了浏览器携带的sid,去存储中查找也找不到对应的session记录,自然无法读取到usertest字段,输出为undefined - 此时因为你没有修改session,服务端不会返回新的
Set-Cookie响应头,浏览器本地的旧connect.sid不会被覆盖/删除,所以反复请求也能看到这个Cookie一直存在
2. 手动删除浏览器connect.sid后,req.session.id仍有值的原因
express-session中间件只要挂载到了Express实例上,每一个请求进入时,都会自动在req上挂载一个新的空session对象,并且自动生成唯一的session id赋值给req.session.id。
但因为你配置了saveUninitialized: false,如果你没有对这个空session做任何修改,它不会被持久化到服务端存储,也不会返回Set-Cookie头让浏览器保存这个新的sid,所以你在浏览器Cookie栏看不到这个新生成的sid,只能在服务端日志里拿到req.session.id的值。
内容的提问来源于stack exchange,提问作者Datadump
相关产品推荐
相关产品推荐

