【问题标题】:Express-session not deleting previous sessions快速会话不删除以前的会话
【发布时间】:2020-08-27 18:10:31
【问题描述】:

我目前正在处理一个新项目,并且我将会话与 express-session 库一起使用。

这是我设置会话的代码:

const IN_PROD = process.env.MODE==='production'
app.use(session({
    name: 'sid',
    secret: 'asecret',
    store: new MongoStore({
        mongooseConnection: mongoose.connection,
        collection: 'sessions'
    }),
    saveUninitialized: false,
    resave: false,
    cookie: {
        sameSite: true,
        secure: IN_PROD,
        expires: new Date(new Date().getTime() + 1000 * 60 * 60 * 24)
    }
}))

想象以下步骤:

1) 我的服务器在 cookie 中向我的客户端发送一个会话 ID (sid=A)。

2) 客户端手动删除cookie

3) 在下一次请求时,客户端发送另一个会话 id (sid=B)

A 和 B 的 cookie 都存储在数据库中并且第一个没有被覆盖是否正常?

【问题讨论】:

    标签: node.js express cookies session-cookies express-session


    【解决方案1】:

    这很正常。这取决于您或您用来清理旧会话的会话存储。

    如果您查看MongoStore() 文档,您会发现它有几个与automatic removal of session objects 相关的功能。

    这是一个例子:

    // connect-mongo will take care of removing expired sessions, using defined interval.
    
    app.use(session({
        store: new MongoStore({
          url: 'mongodb://localhost/test-app',
          autoRemove: 'interval',
          autoRemoveInterval: 10 // In minutes
        })
    }));
    

    请记住,在快速会话级别,会话只是与 cookie 关联的数据块。每当浏览器向您的服务器发出请求并且不存在会话 cookie 时,都会创建一个新的会话 cookie 并连接到该新 cookie 的新快速会话对象。

    如果用户随后删除了该 cookie 并再次连接到您的服务器,则 express-session 不知道此浏览器与前一个会话是同一浏览器。原来的 cookie 是它知道这一点的唯一方法,而 cookie 现在已经消失了。所以,express-session 只是看到一个新的浏览器连接到没有会话 cookie 的服务器,所以它创建一个新的 cookie,然后创建一个新的会话对象来配合它。

    登录用户与 express 会话的任何关联都是在您的应用程序级别完成的(通过将用户标识信息放入会话对象中),而 express-session 根本不知道这一点。

    【讨论】:

    • 如果cookie过期1个月,有人删除cookie刷新页面100次,这100个session会在MongoStore中存储一个月吗?
    • @CustyZ01 - 是的。我不确定为什么在您的数据库中有一些尚未过期的非活动会话是个问题。会话不应该很大。它仅适用于时间数据,不适用于长期用户数据。如果您完全理解我在回答中关于 express-session 实际工作方式的解释,您不会感到惊讶。而且,几乎所有主要网站都面临同样的问题,除了大多数网站不允许登录会话持续一个月。如果您不希望它们在您的数据库中建立很长时间,请使用较短的持续时间来让 Mongo 保留会话。
    • 好的,谢谢,但您知道为什么像亚马逊这样的公司的 cookie 会在 2035 年到期吗?他们是否也在某种形式的数据库中存储会话?
    • @CustyZ01 - 这样他们就知道您是谁,即使您的登录名已过期。该 cookie 不适用于 express-session 之类的东西。此外,您的永久用户数据不会存储在临时会话对象中,而是存储在您的永久数据库记录中。我认为您可能将永久、持久的用户数据与临时会话对象混淆了。它们不是同一件事。出于数据库效率的原因,您可以将一些数据从永久用户数据库记录复制到会话对象(作为一种缓存形式,因此您不必一直在数据库中查找)。
    • @CustyZ01 - 顺便说一下,只有在您拥有登录用户并且确切知道他们是谁之后,您才会将内容放入永久用户记录中,因此即使这样的用户记录也不会累积,即使用户正在弄乱他们的 cookie。
    猜你喜欢
    • 1970-01-01
    • 2021-09-21
    • 2014-04-16
    • 2016-07-06
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    相关资源
    最近更新 更多