在nodejs中刷新页面时保持新会话

时间:2013-03-03 09:23:27

标签: node.js mongodb session express passport.js

我有0.8.21 nodejs和3.1.0 express框架(模块是最新的)。 有着名的heroku项目,包括express,mongodb和passport auth:

https://github.com/madhums/nodejs-express-mongoose-demo

会话存储:

  var express = require('express')
    , mongoStore = require('connect-mongo')(express)

  ...

  app.use(express.logger('dev'))

  // set views path, template engine and default layout
  app.set('views', config.root + '/app/views')
  app.set('view engine', 'jade')

  app.configure(function () {
    // dynamic helpers
    app.use(viewHelpers(config))

    // cookieParser should be above session
    app.use(express.cookieParser())

    // bodyParser should be above methodOverride
    app.use(express.bodyParser())
    app.use(express.methodOverride())

    // express/mongo session storage
    app.use(express.session({
      secret: 'noobjs',
      store: new mongoStore({
        url: config.db,
        collection : 'sessions'
      })
    }))

    // connect flash for flash messages
    app.use(flash())

    // use passport session
    app.use(passport.initialize())
    app.use(passport.session())

    app.use(express.favicon())

    // routes should be at the last
    app.use(app.router)

    ...

问题:我希望用户只能登录70秒,所以我在cookie: {maxAge: 70*1000},之后写了app.use(express.session({,会发生什么:用户只能在70秒内通过网站登录,他们退出了。如果用户刷新页面或浏览链接,会话更新到数据库,如:

{ "_id" : "cVYWfv7kHbaEPNUCD2Bbbaw4",
  "session" : "{\"cookie\":{\"originalMaxAge\":70000,\"expires\":\"2013-03-02T14:46:52.146Z\",\"httpOnly\":true,\"path\":\"/\"},\"passport\":{\"user\":\"51320f3fd04c162d14000003\"},\"flash\":{}}",
  "expires" : Date( 1362235612146 ) }

但是无论如何用户只能登录70秒。我的意思是会话更新为mongodb,新的expires日期,但用户仍然只能在70秒后登录。

请帮帮我。 谢谢。

1 个答案:

答案 0 :(得分:1)

我认为connect-mongo维持会话的TTL索引,该会话在1分钟的间隔后检查是否删除会话。所以你只能在1分钟,2分钟或k分钟内过期,k是整数。如果使用connect mongo expiration logic,则无法删除会话。

你能做什么

  1. 自己为自定义过期编写逻辑,忽略了mongo正在做什么。 (虚假方法)

  2. OR 70秒后,只需在浏览器中删除cookie即可。写一个javascript代码,这样做。虽然有一个缺点,用户可能仍然禁用javascript并让cookie生效,并且有可能他可以将他的会话持续到最大120秒(假设你的expires设置为70秒)。如果在这种情况下这些50秒可能会受到影响,那么你可以使用这个快速优雅的解决方案。