在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。
所以,每当你改变会话时,你都需要在body
, query
或params
传递一个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过期。