我尝试使用Connect/Express cookieSession()
,以便将我的node.js会话存储在cookie中(从而避免服务器端会话存储)。这将帮助我在用户登录时“记住”他们,并在服务器重新启动后保持会话活动。
我想用cookieSession()
来实现:
app.use( express.cookieSession( { secret: 'secret_key' } ) );
app.use( function (req, res, next) {
if ( req.method == 'POST' && req.url == '/login' ) {
if ( req.body.remember ) {
req.session.cookie.maxAge = 30*24*60*60*1000; // Rememeber 'me' for 30 days
} else {
req.session.cookie.expires = false;
}
}
next();
});
但是,这不起作用,因为req.session.cookie未定义。我也尝试了以下方法,但似乎不起作用:
app.use( express.session( { secret: 'secret_key' } ) );
app.use( function (req, res, next) {
if ( req.method == 'POST' && req.url == '/login' ) {
if ( req.body.remember ) {
req.cookies['connect.sess'].maxAge = 30*24*60*60*1000; // Rememeber 'me' for 30 days
} else {
rreq.cookies['connect.sess'].expires = false;
}
}
next();
});
6条答案
按热度按时间yxyvkwin1#
从
然后改成
因此,我们创建自己的中间件,包裹在cookieSession中间件周围,根据参数更改maxAge。
因此,无论何时更改会话,都需要在
body
、query
或params
中传递remember
(这就是req.param()
的位置)。在大多数情况下,您只在登录时为会话设置一次user_id
。它的3秒或20秒来测试,并确保它的工作。
同样,如果你在会话中设置了很多东西,这可能不是很有帮助,但是如果你只是在登录时将user_id设置为会话,这就是你所需要的。
如果你在会话中设置了很多东西,你应该知道每次请求都会传递数据,你应该只保存最少的数据到会话中,比如user_id,然后查找每个请求所需的数据,以减少用户的开销。
oprakyz72#
我想这就是你想要的:
cookieSession
做了一些时髦的东西,比如del req.session.cookie
(不知道为什么)。luaexgnf3#
您必须先设置
req.session.cookie
,以便可以设置maxAge
。在设置之前尝试使用它会给出req.session.cookie is undefined
express.cookieSession
有它接受的默认值,见这里。你应该提到你将要使用的所有参数。您可以通过以下方式设置cookie:qfe3c7zg4#
有点晚了,但我想这个答案可能会帮助人们前进...
我使用的是 cookie-session,它不会在
request.session
上创建cookie对象。为了使用request.session.cookie
正确实现rememberMe功能,我将 cookie-session 切换为 express-session,这解决了所有问题。所以现在会话上有一个cookie对象,并且可以在请求中执行此操作...npm install express-session
7gyucuyw5#
这也很晚了,但它可能会帮助其他人。
在我看来,持久化会话数据的最好方法是将其存储在类似redis的东西中。这个问题要求一种不使用服务器存储的方法,但我认为他更多地是指MemoryStore。也许不是,但无论如何,这就是我所做的。
我使用了express-session和connect-redis
然后你配置东西。
然后,您只需将store选项设置为redisStore即可启动会话。maxAge部分将每个会话的生存期设置为一个小时,会话中间件在访问它时重置它。
现在,当客户端连接时,express应该自动将会话数据存储在Redis数据结构中。因为它不只是缓存在内存中,所以服务器可能会崩溃,但在指定的IP地址和端口上仍然可以使用所有相关的会话数据。
iecba09b6#
Yummy似乎允许在创建后修改cookie过期。