首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >由connect-mongo创建的条目未过期

由connect-mongo创建的条目未过期
EN

Stack Overflow用户
提问于 2014-02-13 19:20:36
回答 2查看 1.8K关注 0票数 6

我用Express设置了一个节点服务器,使用Passport进行身份验证。我听说连接- mongo用于持久登录会话是很好的,所以我已经设置了它,并且一切一开始看起来都很好,用户会话由mongo根据到期时间自动删除。然而,在生产中,对于每个用户会话,还有5000个其他的空会话永不过期,我不知道为什么mongo不能自动清除这些会话。mongo中空会话的一个示例条目如下所示:

代码语言:javascript
复制
{ "_id" : "JMtV5Z1oWRkgh9KIKlwSqwOE",
  "session" : "{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2014-02-13T22:09:09.948Z\",\"httpOnly\":true,\"path\":\"/\"},\"passport\":{}}",
  "expires" : Date( 1392329349948 ) }

以下是Express配置代码:

代码语言:javascript
复制
var express = require('express')
  , passport = require('passport')
  , fs = require('fs')
  , http = require('http')
  , https = require('https')
  , util = require('util')
  , mongoose = require('mongoose')
  , MongoStore = require('connect-mongo')(express)
  , FacebookStrategy = require('passport-facebook').Strategy
  , LocalStrategy = require('passport-local').Strategy;


app.configure(function() {
  app.set('views', __dirname + '/views');
  app.set('view engine', 'ejs');
  app.use(express.logger());
  app.use(requireHTTPS);
  app.use(express.cookieParser());
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.session({ 
    secret: 'asdfasdf',
    cookie: { maxAge: 24 * 60 * 60 * 1000 },
    store: new MongoStore({
        mongoose_connection: mongoose.connections[0],
        clear_interval: 3600
      }, function(err){
        console.log(err || 'connect-mongodb setup ok');
      }
    )
  }));

  app.use(passport.initialize());
  app.use(passport.session());
  app.use(app.router);
  app.use(express.static(__dirname + '/public'), { maxAge: 31557600000 });
});

我认为这些空会话是由搜索机器人创建的,因为我想不出任何其他原因,为什么我的站点会在一夜之间被攻击20,000次。但即使如此,只要会话正确过期,就不会成为问题,我的数据库也不会耗尽内存,但它们永远不会被清理。

任何见解都将不胜感激,谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-19 04:17:41

连接-芒果似乎工作正常。您将maxAge设置为1000天,这就是存储在cookie中的内容。见ttl info 这里

我怀疑您的问题是,实际上您只希望在用户登录时发出cookie,而不是针对任何资产(页面、图像、Javascript等)的每个请求。在这种情况下,您可以在express.cookieParser和express.session前面添加一个可选的第一个参数,这样中间件就只能在某些路径上运行(例如,/login)。

或者,您可以将express.static中间件移动到express.cookieParser之上,这样就不会为静态资产发出cookie。

票数 5
EN

Stack Overflow用户

发布于 2014-02-20 08:52:20

阅读文档这里

删除过期会话 连接-mongo使用MongoDB的TTL收集功能(2.2+)让mongod自动删除过期的会话。(蒙诺德每分钟运行一次检查。) 注意:在connect/express的默认情况下,当用户关闭浏览器时,会话cookie将被设置为过期(maxAge: null)。按照标准的行业惯例,连接-蒙戈将把这些会议从最后一次“设定”起两周结束。您可以通过手动设置cookies的maxAge来覆盖此行为--请记住,任何小于60秒的值都是没有意义的,因为Mon神每分钟只会删除TTL集合中过期的文档。 有关更多信息,请参阅连接的会议文件

代码语言:javascript
复制
cookie: { maxAge: 24 * 60 * 60 * 1000 }

您设置的cookie到期时间为1000天,因此会话不会过期。您可以将其设置为较低的值,比如一两天。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21763598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档