在connect / express中使用cookieSession()时,为会话设置单独的maxAge

我试图使用连接/expressioncookieSession()为了存储我的node.js会话在cookie中(从而避免服务器端会话存储)。 这将帮助我在用户login时“记住”用户,即使在服务器重新启动后仍然保持会话活动。

我想用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(); }); 

从开始

 app.use(express.cookieSession({ secret: config.server.cookieSecret })); 

并改变它

 app.use(function(req, res, next) { express.cookieSession({ secret: config.server.cookieSecret, cookie: { maxAge: req.param('remember') ? 20000 : 3000 }, })(req, res, next); }) 

所以,我们创build自己的中间件,包装cookieSession中间件,根据参数改变maxAge。

所以,每当你改变会话时,你都需要在bodyqueryparams传递一个remember (这就是req.param()外观)。 在大多数情况下,您只需在login时将一个user_id设置为会话一次。

这是3秒或20秒来testing,并确保它的工作。

而且,如果你在会话中设置了很多东西,这可能不是很有帮助,但是如果你只是在login时设置了一个user_id会话,这就是你所需要的。

如果您在会话中设置了很多东西,那么您应该知道每次请求都会传递数据,并且应该只保存会话的最小值,比如user_id,然后查看每个请求所需的数据,以便保留在用户的头顶上。

我认为这是你想要的:

 // Using express.session instead of express.cookieSession 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.session.cookie.maxAge = 30*24*60*60*1000; // needed to make the session `dirty` so the session middleware re-sets the cookie req.session.random = Math.random(); } else { req.session.cookie.expires = false; } } next(); }); 

cookieSession做一些时髦的东西,如del req.session.cookie (不知道为什么)。

您必须先设置req.session.cookie以便您可以设置maxAge 。 在设置之前尝试使用它给req.session.cookie is undefined

express.cookieSession有它接受的默认值,请看这里 。 你应该提到你将要使用的所有参数。 您可以通过以下方式设置Cookie:

 app.use(express.cookieSession({ secret: 'secret_key', cookie :{ path: '/', httpOnly: true, maxAge: 30*24*60*60*1000} }); 

有点晚了,但我认为这个答案可能有助于人们前进…

我正在使用cookie会话 ,它不会在request.session上创build一个cookie对象。 要使用request.session.cookie正确实现rememberMefunction,我将cookie会话切换到了express会话,并解决了所有问题。 所以现在有一个会话cookie对象,这样做的请求是可能的… … –

npm安装快速会话

 app.post('/login', function(request, response, next) { passport.authenticate('local', function(err, user, info) { if(err) return next(err); if(!user) { request.flash('loginMessage', info.message); return response.redirect('/account/login'); } request.login(user, function(err) { if(err) return next(err); if(request.body.rememberMe) request.session.cookie.maxAge = 2592000000; else request.session.cookie.expires = false; return response.redirect(options.redirect); }); })(request, response, next); }); 

这也很晚,但可能会帮助其他人。

对我来说,保持会话数据的最佳方式是将其存储在类似redis的内容中。 这个问题提出了一个不使用服务器存储的方式,但我认为他更多的是指向MemoryStore。 也许不是这样,这是我做的。

我用express-session和connect-redis

 npm install -g connect-redis npm install -g express-session 

然后你configuration的东西。

 // session modules var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var session = require('express-session') var redisStore = require('connect-redis')(session); // this sets up Redis to work with your session cookies var app = express(); 

然后,您只需使用设置到您的redisStore的商店选项启动会话。 maxAge部分将每个会话的生命周期设置为一个小时,会话中间件在访问时将其重置。

 app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(session({ store: new RedisStore({ host:'127.0.0.1', port:6380, prefix:'sess' }), cookie: {maxAge: 3600000 }, secret: 'session_secret' })); 

现在,当客户端连接时,express应该自动将会话数据存储在Redis数据结构中。 由于它不仅caching在内存中,您的服务器可能会崩溃,并仍然在指定的IP地址和端口上保留所有相关的会话数据。

美味似乎允许在创build后修改cookies过期。