当前位置:编程学习 > C#/ASP.NET >>

网站非正常退出处理方法--急

现在在做一个项目,中间涉及到一个用户退出网站的处理机制,如果正常退出,直接释放session即可,但是如果用户直接关闭浏览器(并不限于IE浏览器)或者强制关闭IE进程、死机等情况,session并不能够及时释放(session有效期设为20分钟)。目前我所知道的方法是:
1) 页面嵌入隐藏的iframe,异步刷新页面,服务器记录请求时间,隔一段时间如果收不到请求,就认为用户已退出。但该方法对服务器资源消耗太大,不可取。
2) 页面的onunload事件,但每次页面跳转或打开一个新的页面,都会调用onunload事件,必须判断本网站的所有登录页面是否已全部关闭,如果全部关闭则是否session。但该方式需要每次页面跳转或打开新的页面时,记录页面数目,每次关闭页面时,使页面数目减1,使用session保存页面数目。因session含有不太稳定的因素,用该方法保存对服务器性能也有一定影响。

请问:处理上述两种方式,还有没有更好的处理方法?
要求:能及时判断是否已退出,允许有一定延时,但延时时间不可太长,最好在一分钟内,越短越好;服务器资源消耗尽可能小,不能仅为了实现该功能而使浏览器频繁请求服务器。
小弟在此谢过了 --------------------编程问答-------------------- 每次登陆记录当前用户对应的SESSION.ID

当再次登陆时 验证session.id 是否已改变  如果是,将前一个用户T下线 --------------------编程问答-------------------- 这个用户退出机制很难搞,以前也碰到过这方面的情况。
你要处理用户退出的最终目的是什么?可能可能通过其他方法迂回实现也说不定呢 --------------------编程问答-------------------- 我没说清楚,前一个用户没退出(session未失效)其他用户是不能够登录的,所以怎么判断当前登录的用户是否已经退出网站了,包括关闭浏览器,关闭浏览器进程等非正常方式。
我的目的是怎么判断当前用户是否已退出,而不是是否重新登录 --------------------编程问答-------------------- 据听说是用守护进程也可以比较好的实现,但也不知道如何具体实现的,大家也可以往这方面想想,但不限于这一方法 --------------------编程问答-------------------- 我判断用户是否退出的目的是:如果用户已退出网站或者关闭了浏览器等,重新进入该网站页面时,必须重新输入用户名、密码。如果该用户未退出,其他用户是不允许使用该用户名再次登录的。 --------------------编程问答--------------------
引用 3 楼 ding544935 的回复:
我没说清楚,前一个用户没退出(session未失效)其他用户是不能够登录的,所以怎么判断当前登录的用户是否已经退出网站了,包括关闭浏览器,关闭浏览器进程等非正常方式。
我的目的是怎么判断当前用户是否已退出,而不是是否重新登录


还是没明白什么意思?

重新启动浏览器之类的,session的ID是重新建立的,等同于没有登录了,需要重新登录的

您的网站只能一个用户登录?一个用户登录了其它用户不能登陆? --------------------编程问答-------------------- session是保存在服务器内存中的,客户端关闭浏览器与session释放之间是没有关系的,所以在用户关闭浏览器怎么让服务器比较及时的释放session(不许改变session有效期的设置) --------------------编程问答-------------------- 不是只有一个用户名,是一个用户名不许登录多次,例如你在一台电脑上登录了,那么在另一台电脑上再次登录是不允许的,除非你已经退出 --------------------编程问答-------------------- 我用的是第一种方法,还可以资源消耗不算很大。我是每5秒向服务器端发送一次ajax请求,每个页面需要0.2kB每秒,如果客户端打开100个页面,则服务器需要额外占用20kB每秒的带宽。 --------------------编程问答-------------------- 5秒一次ajax请求,当用户关闭浏览器后最多20秒内可以知道其退出了。 --------------------编程问答-------------------- 用户退出session并没有释放,但是过了二十分钟这里面是指关闭IE这种情况,服务器会进行垃圾回收的,你好像也没有必要为了这么点资源而担心吧


如果你是要求为了使同一个用户只能同时只有一个登录,可以用第一种情况,更改登录用户的在线时间就行了 --------------------编程问答-------------------- 如果你是要求为了使同一个用户只能同时只有一个登录,可以在每打开一个页面的时候用ajax或者直接用服务器端脚本,更改会话用户的最后活动时间,然后登录的时候,对最后活动时间进行判断,这种判断肯定是不会很精确,要是太精确会占很多的资源 --------------------编程问答-------------------- 除了我说的那两种,难道就没有更好一点方法的了吗? --------------------编程问答-------------------- JS扑捉浏览器关闭。

但是怕死机。。死机就判断不了。

还是请求吧。 --------------------编程问答-------------------- 我是想找除了上面的异步请求刷新和onload事件之外的比较好的实现判断退出的方法,难道真的没有吗 --------------------编程问答--------------------
引用 15 楼 ding544935 的回复:
我是想找除了上面的异步请求刷新和onload事件之外的比较好的实现判断退出的方法,难道真的没有吗

说错了,是onunload事件 --------------------编程问答-------------------- 你能做得出来,连网银都要问你要代码了。 --------------------编程问答--------------------
引用 17 楼 winner2050 的回复:
你能做得出来,连网银都要问你要代码了。

据我们的ld说,确实存在这样的方法,他以前都做过,具体的需要我自己研究发现 --------------------编程问答-------------------- 我也想知道这么实现,lz问下你们ld具体思路是什么 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 14 楼 wxr0323 的回复:
JS扑捉浏览器关闭。

但是怕死机。。死机就判断不了。

还是请求吧。


如果客户端直接杀浏览器进程、断电。。。。也捕捉不到~ --------------------编程问答--------------------
这帖也发成个月经贴了。。。
--------------------编程问答-------------------- 每半分钟请求一次开销并不大啊,如果连这个都受不了,你提供的其它服务估计早崩了 --------------------编程问答-------------------- 楼主很搞笑,session是会自己回收的。 --------------------编程问答-------------------- 按照你说的就只有像10楼说的那样,每过一段时间发个请求了,至于时间你就自己控制了 --------------------编程问答-------------------- 最近也要遇到这个登录的问题,唉,郁闷~ --------------------编程问答-------------------- 用cookie行不行? --------------------编程问答-------------------- 记录打开的页面数量,然后每次onunload的时候-1;
这样当次数为0的时候就去释放session --------------------编程问答-------------------- 用session监听器.但是仍然不能解决延迟的问题.
不知道QQ是怎么实现异常退出的. --------------------编程问答-------------------- 增加一个在线会员表,记录会员ID,sessionid,本次登录时间,最后活动时间,然后不断更新这个表,最后活动时间超过某个设定时间就从表中删除,如果没有超过就将最后活动时间更新为now,如果是同一个会员ID,sessionid不同,可将前一个删除,或者使用其他处理方式。根据经验session.timeout不准 --------------------编程问答-------------------- 在客户端记录一个cookies,没打开一个页面,cookies里的值加1,关闭一个页面,cookies减1,在unonload事件里执行 --------------------编程问答-------------------- session说的是保存在服务器端的,其实他和cookie是一样的 就是保存在客户端 --------------------编程问答-------------------- 加一个处理登陆的token --------------------编程问答-------------------- --------------------编程问答-------------------- lz对session理解不深,session20分钟有效是指session的值,而非与服务器通讯时的并发session。
用户非正常退出不会影响你的并发性能,只是要在20分钟后值才会删除 --------------------编程问答-------------------- 因为完美的结束是不存在的(断网、掉电、地震、海啸、水淹、核辐射……)
所以只能用“在上次的‘废墟’中完美的重建”来解决问题。
--------------------编程问答--------------------
引用 8 楼 ding544935 的回复:
不是只有一个用户名,是一个用户名不许登录多次,例如你在一台电脑上登录了,那么在另一台电脑上再次登录是不允许的,除非你已经退出

这个需求明显有问题吧,如果号被别人盗走了,不下线的话,岂不是永远也等不上了?

应该采用QQ的方法,后登陆的顶掉之前登陆的,并且会告知双方对方的ip
--------------------编程问答-------------------- --------------------编程问答-------------------- 看的晕.....
--------------------编程问答-------------------- 这还不简单,你把session的超时时间改为1分钟,然后在客户端用异步ajax连一下服务器(30秒左右,总之要小于1分钟),告诉服务端,我还没走。。这样,如果浏览器异常退出的话,不就可以在一分钟内清除session了? --------------------编程问答-------------------- 觉得还是 37 楼说的有理, 更何况 目前也想不出 啥更好的办法 --------------------编程问答-------------------- 复杂的问题。偶记得以前做过的方法是记住最后登录的时间。在设置一个时间差。判断时间是否在时间差之内。 --------------------编程问答--------------------
引用 36 楼 zhao4zhong1 的回复:
因为完美的结束是不存在的(断网、掉电、地震、海啸、水淹、核辐射……)
所以只能用“在上次的‘废墟’中完美的重建”来解决问题。
经典 --------------------编程问答--------------------
引用 1 楼 q107770540 的回复:
每次登陆记录当前用户对应的SESSION.ID

当再次登陆时 验证session.id 是否已改变 如果是,将前一个用户T下线

你这说的,我知道前一个SESSION。id 

你说怎么根据前一个SESSION。id 将他T下线 --------------------编程问答--------------------
引用 27 楼 qdltl 的回复:
用cookie行不行?

? --------------------编程问答-------------------- 还没解决问题?都候着呢 --------------------编程问答--------------------
引用 44 楼 zmcici 的回复:
引用 1 楼 q107770540 的回复:
每次登陆记录当前用户对应的SESSION.ID

当再次登陆时 验证session.id 是否已改变 如果是,将前一个用户T下线

你这说的,我知道前一个SESSION。id 

你说怎么根据前一个SESSION。id 将他T下线

HttpSessionState.SessionID --------------------编程问答--------------------
引用 47 楼 ltcszk 的回复:
引用 44 楼 zmcici 的回复:

引用 1 楼 q107770540 的回复:
每次登陆记录当前用户对应的SESSION.ID

当再次登陆时 验证session.id 是否已改变 如果是,将前一个用户T下线

你这说的,我知道前一个SESSION。id

你说怎么根据前一个SESSION。id 将他T下线

HttpSessionState.SessionID

答非所问 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 48 楼 zmcici 的回复:
引用 47 楼 ltcszk 的回复:
引用 44 楼 zmcici 的回复:

引用 1 楼 q107770540 的回复:
每次登陆记录当前用户对应的SESSION.ID

当再次登陆时 验证session.id 是否已改变 如果是,将前一个用户T下线

你这说的,我知道前一个SESSION。id

你说怎么根据前一个SESSION。id 将他T下线

HttpSes……

我告诉你了sessionid获取方法了,你还有什么不懂的?
每次记录sessionid,请求时先和上次的sessionid比较,不同就警告 --------------------编程问答--------------------
引用 9 楼 dalmeeme 的回复:
我用的是第一种方法,还可以资源消耗不算很大。我是每5秒向服务器端发送一次ajax请求,每个页面需要0.2kB每秒,如果客户端打开100个页面,则服务器需要额外占用20kB每秒的带宽。
在这个基础上.我觉得可以在客户端的js中加入一个判断.全局保存到cookie里面去.
比如.你打开一个页面A的时候cookie记录A.aspx中的js正在请求ajax
那么当你打开B页面的时候.读取A是否关闭了,则清除cookie中的记录.如果关闭了.那么B.aspx中的js继续请求ajax
以此类推

当停电死机的时候.所有页面都不会请求了
服务器就会把超市的设置为离线 --------------------编程问答--------------------
引用 51 楼 luoweihua7 的回复:
在这个基础上.我觉得可以在客户端的js中加入一个判断.全局保存到cookie里面去.
比如.你打开一个页面A的时候cookie记录A.aspx中的js正在请求ajax
那么当你打开B页面的时候.读取A是否关闭了,则清除cookie中的记录.如果关闭了.那么B.aspx中的js继续请求ajax
以此类推

这个想法比较好,对我有启发,这样可以减少多页面时的流量。 --------------------编程问答-------------------- 要求太多。无解
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,