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

时间:2013-03-19 16:22:27

标签: node.js express session-cookies connect

我正在尝试使用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 个答案:

答案 0 :(得分:2)

开始
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);
})

因此,我们创建了自己的中间件,包含在cookieSession中间件中,根据参数更改了maxAge。

因此,无论何时更改会话,您都需要在rememberbodyquery中传递paramsreq.param()看起来)。在大多数情况下,您只需在登录时将user_id设置为会话一次。

测试并确保其正常工作为3秒或20秒。

同样,如果你正在为你的会话设置很多内容可能不是很有帮助,但是如果你只是在登录时将user_id设置为session,那么这就是你所需要的。

如果要为会话设置大量内容,您应该知道每次请求都会传递数据,并且您应该只保存会话的最小值,例如user_id,然后查找每个请求所需的数据,以减少用户的开销。

答案 1 :(得分:1)

我认为这可以做你想要的:

// 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(不知道为什么)。

答案 2 :(得分:0)

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

express.cookieSession具有接受的默认值,请参阅here。您应该提到您要使用的所有参数。您可以通过以下方式设置cookie:

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

答案 3 :(得分:0)

有点晚了,但我认为这个答案可以帮助人们前进......

我正在使用 cookie-session ,它不会在request.session上创建Cookie对象。要使用request.session.cookie正确实现rememberMe功能,我将 cookie-session 切换为 express-session ,这解决了所有问题。所以现在会话中有一个cookie对象,并且可以在请求中执行此操作...

  

npm install express-session

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);
});

答案 4 :(得分:0)

这也很晚,但可能对其他人有所帮助。

在我看来,保留会话数据的最佳方法是将其存储在像redis这样的东西中。问题是要求一种不使用服务器存储的方法,但我认为他更多地指的是MemoryStore。也许不是,但不管怎么说,这就是我所做的。

我使用了express-session和connect-redis

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

然后你配置东西。

// 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数据结构中。由于它不仅仅缓存在内存中,因此您的服务器可能会崩溃,并且仍然可以在指定的IP地址和端口上获得所有相关的会话数据。

答案 5 :(得分:-1)

Yummy似乎允许在创建后修改cookie到期。