关于Node.js的Session
发布于 6 年前 作者 huazhenhz 5415 次浏览 最后一次编辑是 4 年前 来自 问答

之前有使用过微软的ASP.NET/ASP,可以通过Global.asax(global.asa)文件的Session_Start和Session_End事件来侦听Session的创建和销毁动作。 但在PHP和Node.js里就没有这样的机制。

想了解一下,Node.js里是如何实现的。

还有,如果将Session通过Mongoose存储在MongoDB里(如下方代码所示),interval: 120000需要怎样理解?这里所说的120秒的过期时间是如何起算的?是闲置120秒(120秒内没有向服务器提交任何新的请求),还是说无论页面是否闲置,120秒后就一定过期?个人有疑虑,感觉Node.js的会话机制与ASP.NET有所不同。尤其是将会话存储在MongoDB或是Redis这样的NoSQL数据库时,系统应该很难感知到用户会话会因闲置过久而超时过期。

还有,存储在MongoDB里的Session如何在MongoDB里进行查询?

var connect = require(‘connect’); var SessionStore = require(“session-mongoose”)(connect); var store = new SessionStore({ url: “mongodb://localhost/session”, interval: 120000 });

个人是新手,对Node.js了解的实在太少,也不知我的问题有没有描述清楚,还望各位能不吝赐教。 多谢!!!

13 回复

没有人能解释一下吗?

《Nodejs开发指南》中的Microblog示例项目中有简单使用Session以及使用Mongodb存储Session的内容,可以网上找一找开源的Microblog学习项目看看,比如:https://github.com/tonyzhan/microblog

@RanHuang 多谢指点! 您提供的实例资料对于初学者很有用。 只是这些资料,似乎还没有完全涉及到有关会话的超时机制(也许是我看得还不够细致)。 另外,我还想了解,如果将Session存储在MongoDB中,如何能在MongoDB里利用这个NoSQL数据库的查询机制查找到相应的Session资料(给出的实例似乎也没有涉及到。)。

再次感谢您的帮助!

找到几个参考网址(以备后续参考): 一个mongodb存储session的模块 https://www.npmjs.org/package/connect-mongo http://www.senchalabs.org/connect/session.html https://www.npmjs.org/package/express-session-mongo http://docs.mongodb.org/manual/tutorial/expire-data/

另外,不使用session-mongoose也能将session存储在MongoDB里,而且还可以设定会话过期时间: 参考网址: Session lifetime in node.js with express and MongoDB

再提供一个网址顺便了解一下Nodejs基础中间件Connect,这里也有提及Session的使用: http://blog.fens.me/nodejs-connect/

根据我的理解,120 * 2 秒后就一定过期,但时间不确定。

尤其是将会话存储在MongoDB或是Redis这样的NoSQL数据库时,系统应该很难感知到用户会话会因闲置过久而超时过期。

系统是有感知的。

QQ20140909-2.png

session-mongoose 这个库会开个 workder 去定时检测。

可以用MONGODB - TTL 索引 创建一个过期会话 db.foo.ensureIndex({lastTime:1}, {expireAfterSecs:60*60})

对于活跃用户,每一次访问更新该字段的最新值。

当然首先,你需要一个md5或者sha1来加密存储用户session id

@alsotang 想确认一下,如果是用户在指定的时间里始终处于活动状态(有向服务器提交新的请求),那么在该用户提出请求之后,系统会重新计算过期时间吗?还是,不管用户在指定的时间里有没有向服务器提出新的请求,系统一律忽略,到时间就视作过期?

多谢解答!

@tulayang 想顺便了解一下,{lastTime:1}是何所指? 多谢!

@huazhenhz 不好意思,已经了解了,非常感谢!

@huazhenhz

lastTime是集合的一个索引字段,可以随便起个名字,用来记录更新的时间,必须是Date类型。 expireAfterSecs指定从lastTime时间经过expireAfterSecs秒后,该条文档删除。

@tulayang 不好意思,之前沒有看MongoDB的文档。 lastTime是指字段名,1是指排序方式。 非常感谢!

@tulayang 原来mongo还有这种索引的!

学习了!!!

回到顶部