express session,发帖后如何获取session?我在浏览器中的 cookie 下看到会话 ID,但它在请求对象中未定义?
Express session, how do I get the session after posting? I see the session ID in browser under cookies, but it's undefined in request object?
抱歉各位,我对会话和 cookie 真的很陌生,我正在尝试了解其背后的机制。我想将 register/login 添加到我的简单网站,为此我需要了解 Web 身份验证,我真的认为我会有很多关于这个主题的问题。
最初,我有一个注册页面,在单击提交按钮后使用 express 将信息发送到节点服务器。
我想看看会发生什么,所以我在 post 路由中创建了一个会话,它是在浏览器中创建的 (connect.sid),然后我注释掉了创建该会话的部分并尝试重新显示会话对象,但它是未定义的,但我仍然可以在浏览器的 cookies 部分中看到会话,这是怎么回事?谢谢
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...");
})
即使在注释掉创建会话并反复 posting 之后,我仍然可以看到会话 cookie。
connect.sid s%3A_TahsTv0xhY-iHIdjDRblYJ_aZZ5oiSd.do7JcOGR1FaXPcFFIQ6hg5AW%2B0XVsYwIRO8vndyjDzs
req.session.id 产生不同的值(不是未定义的),即使我在浏览器中删除我的会话,所以不确定它来自哪里。
会话对象中没有“usertest”键,因此未定义。当您取消注释该行时它不是未定义的原因是因为您在那一刻用该行自己创建了该密钥。
您可以使用 req.session 获取整个会话对象,使用 req.session.id 获取会话 ID,使用 req.session.cookie.[=11= 获取会话 cookie ]
编辑
进一步说明:将为每个连接的客户端创建一个会话。这就是为什么您可以在浏览器中看到 cookie 的原因。然而,这没有任何意义,它只是一种唯一标识该客户的方式(实际上并没有告诉您该客户是谁)。有关该会话的任何信息(无论他们是否登录、用户 ID 等)都需要存储在会话存储中。默认情况下,Express-session 将使用内存存储,如果服务器重新启动,所有信息都将丢失,这就是该密钥不存在的原因。为了保留该信息,它必须存储在持久会话存储中。有关快速会话的会话存储实现以及如何使用它们的更多信息,请参见此处:https://www.npmjs.com/package/express-session
至于你得到的cookie值,那些是express-session设置的默认值,因为你没有自己设置。您可以更改 maxAge 以让它过期(或将其设置为 10 年或更长时间以获得更持久的会话),您可以指定该 cookie 所属的域,您可以将其设置为安全(仅允许它通过安全连接,例如 https) 和 httpOpnly 默认为 true。 httpOnly cookies 不能被客户端 accessed/altered(虽然你可以在浏览器中看到它们),不要将其设置为 false。
抱歉各位,我对会话和 cookie 真的很陌生,我正在尝试了解其背后的机制。我想将 register/login 添加到我的简单网站,为此我需要了解 Web 身份验证,我真的认为我会有很多关于这个主题的问题。
最初,我有一个注册页面,在单击提交按钮后使用 express 将信息发送到节点服务器。 我想看看会发生什么,所以我在 post 路由中创建了一个会话,它是在浏览器中创建的 (connect.sid),然后我注释掉了创建该会话的部分并尝试重新显示会话对象,但它是未定义的,但我仍然可以在浏览器的 cookies 部分中看到会话,这是怎么回事?谢谢
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...");
})
即使在注释掉创建会话并反复 posting 之后,我仍然可以看到会话 cookie。
connect.sid s%3A_TahsTv0xhY-iHIdjDRblYJ_aZZ5oiSd.do7JcOGR1FaXPcFFIQ6hg5AW%2B0XVsYwIRO8vndyjDzs
req.session.id 产生不同的值(不是未定义的),即使我在浏览器中删除我的会话,所以不确定它来自哪里。
会话对象中没有“usertest”键,因此未定义。当您取消注释该行时它不是未定义的原因是因为您在那一刻用该行自己创建了该密钥。
您可以使用 req.session 获取整个会话对象,使用 req.session.id 获取会话 ID,使用 req.session.cookie.[=11= 获取会话 cookie ]
编辑
进一步说明:将为每个连接的客户端创建一个会话。这就是为什么您可以在浏览器中看到 cookie 的原因。然而,这没有任何意义,它只是一种唯一标识该客户的方式(实际上并没有告诉您该客户是谁)。有关该会话的任何信息(无论他们是否登录、用户 ID 等)都需要存储在会话存储中。默认情况下,Express-session 将使用内存存储,如果服务器重新启动,所有信息都将丢失,这就是该密钥不存在的原因。为了保留该信息,它必须存储在持久会话存储中。有关快速会话的会话存储实现以及如何使用它们的更多信息,请参见此处:https://www.npmjs.com/package/express-session
至于你得到的cookie值,那些是express-session设置的默认值,因为你没有自己设置。您可以更改 maxAge 以让它过期(或将其设置为 10 年或更长时间以获得更持久的会话),您可以指定该 cookie 所属的域,您可以将其设置为安全(仅允许它通过安全连接,例如 https) 和 httpOpnly 默认为 true。 httpOnly cookies 不能被客户端 accessed/altered(虽然你可以在浏览器中看到它们),不要将其设置为 false。