在请求之外的会话,验证和操作

时间:2014-01-22 09:16:05

标签: node.js mongodb session redis

我的应用程序在登录时将用户的文档从数据库加载到redis会话中。然后,它几乎完成了针对会话对象的所有请求验证。

The problem:修改请求/响应周期之外的正在进行的会话以更新验证信息。

例如,如果用户订阅了博客帖子类别,他们可以阅读该类别中的帖子以及对该类别的贡献。但是,如果该类别的主持人决定删除它,那么我需要不仅从磁盘上数据库中的用户文档中删除该类别,还要删除redis中的用户会话。

据我所知,我能做到这一点的唯一方法是在数据库的用户文档中保存对会话ID的引用,并在redis中查找相应的会话。

问题在于我不确定这些会话是否被设计为在请求/响应周期之外进行修改,因为我在谷歌搜索时没有真正看到任何想要这样做的相关主题。

1 个答案:

答案 0 :(得分:1)

我不认为在mongo上存储有关会话的信息是一个好主意。如果用户同时从两个设备登录会发生什么?我想在这种情况下你会有两个会话对象(否则,应该有一个机制来猜测给定用户的会话,然后你就不会遇到当前的问题)。

我的建议是在redis中存储用户启动的会话SET。当用户登录时,您将新会话ID添加到SET,并将用户ID作为密钥的一部分。当用户注销时,您将从SET中删除相应的条目。

当然,如果没有用户手动注销,会遇到会话过期的问题(如果您有这种行为)。为此,每次启动新会话时,您都可以将SETEXP设置为用户集。只要您的SETEXP时间比会话到期时间稍长,您就可以确保只要您的会话存在,会话就会存储在您的SET中。

新版本的redis将具有一个Observe命令,可以更轻松地删除从设置对象中删除的会话。您只需要观察会话对象的创建/删除,您就可以根据它来管理SET插入/删除。在该命令正式发布之前,您必须坚持到期时间到期。