结束的会议没有被销毁

时间:2016-08-18 00:53:07

标签: node.js mongodb express keystonejs connect-mongo

我的应用正在使用connect-mongoexpress-sessionkeystonepassport来处理登录和用户会话。

但是,当会话结束时(用户注销或关闭浏览器窗口),会话不会从MongoDB会话存储中删除。

这是我的中间件设置:

scrolling

MongoDB中会话的集合名称是 app_sessions 。在我的依赖关系树中搜索显示这是由Keystone CMS处理的。

Cookie名称也是 keystone.sid

这是我的Keystone配置:

var express = require('express')
    , path = require('path')
    , cookieParser = require('cookie-parser')
    , bodyParser = require('body-parser')
    , passport = require('passport')
    , session = require('express-session')
    , mongoStore = require('connect-mongo')(session)
    , compression = require('compression')
    , favicon = require('serve-favicon')
    , config = require('../config')
    , flash = require('connect-flash');

app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb', parameterLimit: 52428800, extended: true}));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(compression());
app.use(express.static(path.join(__dirname, '../', config.get('staticContentPath')), {
    maxAge: (60 * 60 * 24 * 7) * 1000 
}));

app.use(session({
    secret: process.env.COOKIE_SECRET,
    resave: false,
    saveUninitialized: true,
    cookie: {
        maxAge: 24 * 60 * 60 * 1000 // 24 hrs
    },
    store: new mongoStore({
        url: config.get('mongo')
    })
}));

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

最后来自MongoDB的一些示例会话对象:

var config = require('../../lib/config')
    , keystone = require('keystone');

module.exports = function(app){

    keystone.init({
        'app': app,
        'port': config.get('keystone').port,
        'brand': config.get('sitename'),
        'views': app.get('views'),
        'view engine': app.get('view engine'),
        'custom engine': app.get('custom engine'),
        'auto update': false,
        'session': true,
        'session store': 'mongo',
        'auth': true,
        'user model': 'Account',
        'cookie secret': process.env.COOKIE_SECRET,
        'compress': true,
        'frame_guard': 'deny',
        'mongo': config.get('mongo')
    });

    keystone.import('../../lib/models');
    keystone.start();
};

你能发现为什么会议不会被销毁吗?

1 个答案:

答案 0 :(得分:0)

  

为什么用户即使在关闭浏览器后也会登录?

显然是因为它是一个很好的功能。即使在浏览器关闭后仍保持会话。但是如果你想在关闭浏览器时使会话到期,那么你可以将maxAge设置为-1

  

为什么即使在注销后也不会删除会话数据?

我认为这是keystone.JS的开发者可能选择的。我只是在keystone / lib / session.js 中查看注销功能。

这里是调用 req.session.regenerate

可能应该调用 req.session.destroy 。我只是想做那个改变和测试。但我仍然可以在数据库中看到会话。然后我想。解决方案是clear_interval