0

我有 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 秒后登录。

请帮帮我。谢谢你。

4

1 回答 1

1

我想 connect-mongo 在会话上维护一个 TTL 索引,该索引在 1 分钟间隔后检查是否删除会话。所以你只能让你的会话在 1 分钟、2 分钟或 k 分钟内过期,k 是整数。如果使用连接 mongo 过期逻辑,则不能删除会话。

你可以做什么

  1. 要么自己为自定义过期编写逻辑,而忽略 connect mongo 正在做什么。(伪方法)

  2. OR70 秒后,只需删除浏览器中的 cookie。编写一个这样做的javascript代码。尽管有一个缺点,用户可能仍然会禁用 javascript 并让 cookie 存活,并且他可能可以将会话继续到 120 秒 @ max(假设您将会话expires设置为 70 秒)。如果在这种情况下这 50 秒可能会受到影响,那么您可以使用这个快速优雅的修复。

于 2013-03-03T10:12:36.200 回答