CNode

关于Node.js的Session

问答
Hhuazhenhz发布于12 年前最后回复12 年前13 回复8209 浏览0 收藏

之前有使用过微软的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)

H
huazhenhz#1·12 年前

没有人能解释一下吗?

R
RanHuang#2·12 年前

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

H
huazhenhz#3·12 年前
引用 RanHuang《Nodejs开发指南》中的Microblog示例项目中有简单使用Session以及使用Mongodb存储Session的内容,可以网上找一找开源的Microblog学习项目看看,比如:htt...

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

再次感谢您的帮助!

H
huazhenhz#4·12 年前

找到几个参考网址(以备后续参考): 一个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/

A
alsotang#5·12 年前

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

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

系统是有感知的。

QQ20140909-2.png

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

T
tulayang#6·12 年前

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

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

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

H
huazhenhz#7·12 年前
引用 alsotang根据我的理解,120 2 秒后就 一定 过期,但时间不确定。 尤其是将会话存储在MongoDB或是Redis这样的NoSQL数据库时,系统应该很难感知到用户会话会因闲置过久而超时过期。 系统是...

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

多谢解答!

T
tulayang#10·12 年前
引用 tulayang可以用MONGODB TTL 索引 创建一个过期会话 db.foo.ensureIndex({lastTime:1}, {expireAfterSecs:60 60}) 对于活跃用户,每一次访...

@huazhenhz

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

H
huazhenhz#11·12 年前
引用 tulayang可以用MONGODB TTL 索引 创建一个过期会话 db.foo.ensureIndex({lastTime:1}, {expireAfterSecs:60 60}) 对于活跃用户,每一次访...

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

H
hainee#13·12 年前

学习了!!!

参与回复
登录后即可参与回复。登录