快速会话,发布后如何获取会话?我在浏览器中的 cookie 下看到会话 ID,但它在请求对象中未定义?



对不起,伙计们,我对会话和cookie真的很陌生,我正在努力了解它背后的机制。我想在我的简单网站上添加注册/登录,为了做到这一点,我需要了解网络身份验证,我真的认为我会对这个主题有很多问题。

最初,我有一个注册页面,在点击提交按钮后使用express将信息发送到节点服务器。我想看看会发生什么,所以我在路由后创建了一个会话,它是在浏览器中创建的(connect.sid(,然后我注释掉了创建该会话的部分,只是试图重新显示会话对象,但它是未定义的,但我仍然可以在浏览器的cookie部分中看到该会话,那么发生了什么?感谢

app.use(session({
secret:"my test secret",
cookie:{},
resave:false,
saveUninitialized:false
}))
app.post("/register", (req, res) => {
req.session.usertest = "testsession_hardcodedvaluefornow";
console.log(req.session.usertest); // -> this is okay when above line to create is uncommented
//but when I comment the session assignment, it becomes undefined?
res.send("In register...");
})

即使在评论完创建会话并一遍又一遍地发布之后,我也可以看到会话cookie。

connect.sid s%3A_TagsTv0xhY-iHIdjDRblYJ_aZZ5oiSd.do7JcOGR1FaXPcFFIQ6hg5AW%2BXVsYwIRO8vndyjDzs

req.session.id会产生一个不同的值(未定义(,即使我在浏览器中删除了会话,所以不确定它是从哪里来的。

没有"用户测试";键,因此它是未定义的。当你取消注释该行时,它没有被定义的原因是因为你在那一刻用该行自己创建了键。

您可以使用req.session获取整个会话对象,使用req.session.id获取会话id,使用req.session.cookie获取会话cookie。

编辑

为了进一步澄清:将为每个连接的客户端创建一个会话。这就是为什么你可以在浏览器中看到cookie。然而,这没有任何意义,这只是一种唯一识别客户的方式(而无需实际告诉你该客户是谁(。关于该会话的任何信息(无论他们是否登录、用户id…(都需要存储在会话存储中。默认情况下,Express会话将使用内存存储,如果服务器重新启动,所有信息都将丢失,这就是该密钥不存在的原因。为了保存这些信息,必须将其存储在持久会话存储中。有关express会话的会话存储实现以及如何使用它们的更多信息,请访问此处:https://www.npmjs.com/package/express-session

至于您获得的cookie值,这些是express会话设置的默认值,因为您自己没有设置任何值。您可以更改maxAge使其过期(或者为更持久的会话设置为10年或更长时间(,您可以指定cookie所属的域,您可以将其设置为安全(仅允许通过安全连接,例如https(,httpOpnly默认为true。httpOnly cookie不能被客户端访问/更改(尽管您可以在浏览器中看到它们(,不要将其设置为false。

最新更新