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

b/s系统用户帐户的登入与退出的判断

我给别人一个帐户,别人登入到我们系统时,如何判断用户登入(我的想法是在数据库用户表里面加一个字段,如果登入了,就设为false,这样就不能有其他人使用这个帐号登入。退出时设为true,这时就可以登入)
但是用户退出时,我怎么判断用户退出了?因为退出时会有很多可能,比如说死机啊,从进程关掉啊等等..我如何知道用户非正常退出。
本人菜鸟,希望大家能帮帮忙。 --------------------编程问答-------------------- --------------------编程问答-------------------- 那就设置一个算法,每个固定时段向服务器发送数据验证是否在线,若不在线重试次数超过3次,自动判断退出。 --------------------编程问答-------------------- 目前为止最好的方法: Session

然后在Sesssion_end里写事件.


理由:如果用别的方法,客户端如果突然断电会怎么办?这样,一个用户的信息就不能正确的获取.



注明: 在Session_end里还是能取到超时的Session值的,所以,推荐楼主用这种方法喽 --------------------编程问答-------------------- LSD的我也想过
就是不停和服务器进行数据验证 如果没有数据验证 就判断退出
但是这样我怕影响性能或者速度
不知道有什么其他方法没 --------------------编程问答--------------------
引用 3 楼 che2piaopiao 的回复:
目前为止最好的方法: Session 

然后在Sesssion_end里写事件. 


理由:如果用别的方法,客户端如果突然断电会怎么办?这样,一个用户的信息就不能正确的获取. 


注明: 在Session_end里还是能取到超时的Session值的,所以,推荐楼主用这种方法喽


那样非正常退出后,不是要等session过期才能登入? --------------------编程问答-------------------- 急啊- -
快来人帮下小弟
g查不到呀 --------------------编程问答-------------------- 1 客户端请求
2 session
3 定时在线验证码 --------------------编程问答-------------------- 楼上的方法不错.. --------------------编程问答--------------------
引用 7 楼 qiuming0306 的回复:
1 客户端请求 
2 session 
3 定时在线验证码

那还是有时间限制?session时间我们设置的是10分钟,不可能要别人等10分钟在登入吧。? --------------------编程问答-------------------- 登陆了就不让再登陆了
这种设计有什么好处呢? --------------------编程问答-------------------- 一般用AJAX定时向服务器发送数据,比如几点几分几秒,某某用户名,在线,服务器端更新用户最后发送时的数据,如果用户最后发送时间与现在比大于5分钟(自己可以随便设定)就可以表示为用户已经离线了 --------------------编程问答-------------------- 说实话就退出是没有十全十美的解决方案的,只能找一个你觉得比较适合,能够接受的方案 --------------------编程问答--------------------
引用 10 楼 greatchao88 的回复:
登陆了就不让再登陆了 
这种设计有什么好处呢?

先不谈好处吧,我们做的这个是必须的。还是谈谈咱的问题吧。 --------------------编程问答-------------------- 帮顶一下 --------------------编程问答--------------------
引用 11 楼 liujiayu10 的回复:
一般用AJAX定时向服务器发送数据,比如几点几分几秒,某某用户名,在线,服务器端更新用户最后发送时的数据,如果用户最后发送时间与现在比大于5分钟(自己可以随便设定)就可以表示为用户已经离线了

这个也是我考虑的方法,顶一个~ --------------------编程问答-------------------- 用最新的登录会覆盖旧的登录。就是新登入的人往数据库写一个登录随机码,并且这个随机保存在登录信息中,这样,以前登录的人验证的时候,会发现和当前随机码不同,他就登录失效了。这样就可以保证只有一个人能登入。

用这种模式的比如QQ,第二个登录的人会使第一个人离线。

其实这样设置是合理的,因为一个帐户只应该由一个人保管密码。 --------------------编程问答-------------------- 你用 HttpCookie和Session联合验证
应该就有实现了 --------------------编程问答-------------------- 不停地发数据验证这种方法实在不敢恭维。。。。。。 --------------------编程问答-------------------- 顶3楼的 --------------------编程问答-------------------- 一般来说用session,但是有时候会出现session丢失的情况
session还有一个问题就是当用户因为断电、断网等特殊原因而退出时,session不能及时回收。 --------------------编程问答--------------------
引用 16 楼 Moosdau 的回复:
用最新的登录会覆盖旧的登录。就是新登入的人往数据库写一个登录随机码,并且这个随机保存在登录信息中,这样,以前登录的人验证的时候,会发现和当前随机码不同,他就登录失效了。这样就可以保证只有一个人能登入。 

用这种模式的比如QQ,第二个登录的人会使第一个人离线。 

其实这样设置是合理的,因为一个帐户只应该由一个人保管密码。

怎么判断用户非正常退出呢? --------------------编程问答-------------------- 路过看看~ --------------------编程问答--------------------
引用 17 楼 hhxxcj 的回复:
你用 HttpCookie和Session联合验证 
应该就有实现了

请问如何联合验证? --------------------编程问答-------------------- 为什么要判断他非正常退出呢?
你的系统应该能够保证他只能从登陆页面进入,如果他关闭了浏览器,就只好重新登录,只要重新登录就会生成新的登录随机码,他爱非常退出就随他便。 --------------------编程问答--------------------
引用 24 楼 Moosdau 的回复:
为什么要判断他非正常退出呢? 
你的系统应该能够保证他只能从登陆页面进入,如果他关闭了浏览器,就只好重新登录,只要重新登录就会生成新的登录随机码,他爱非常退出就随他便。

断电,死机都会非正常退出,我们应该考虑到。 --------------------编程问答-------------------- 因为没有登录信息,和有登录信息但随机码不正确是两个概念,并且很容易区分,如果是随机码不对,还可以给出提示,你的帐号在别的电脑上登录,你现在被迫下线了。 为了追踪,登录的时候还可以把登录的主机名或IP 记录下来。 --------------------编程问答--------------------
引用 25 楼 simple870617 的回复:
引用 24 楼 Moosdau 的回复:
为什么要判断他非正常退出呢? 
你的系统应该能够保证他只能从登陆页面进入,如果他关闭了浏览器,就只好重新登录,只要重新登录就会生成新的登录随机码,他爱非常退出就随他便。 
 
断电,死机都会非正常退出,我们应该考虑到。


我晕,不知道你怎么想的。
他断电死机关系统什么事? 你为什么想要知道别人是否断电死机?
我的意思是说,他是否非正常退出,你根本不必关心。 --------------------编程问答--------------------
引用 27 楼 Moosdau 的回复:
引用 25 楼 simple870617 的回复:
引用 24 楼 Moosdau 的回复: 
为什么要判断他非正常退出呢? 
你的系统应该能够保证他只能从登陆页面进入,如果他关闭了浏览器,就只好重新登录,只要重新登录就会生成新的登录随机码,他爱非常退出就随他便。 

断电,死机都会非正常退出,我们应该考虑到。 
 

我晕,不知道你怎么想的。 
他断电死机关系统什么事? 你为什么想要知道别人是否断电死机? 
我的意思是说,他是否非正常…

帐号登入后就不能在登入,必须等退出才能重新登入,正常退出可以判断,非正常退出怎么判断用户退出呢? --------------------编程问答-------------------- 谁能指教下小弟呀~ --------------------编程问答-------------------- 定时检查session是否存在。。。 --------------------编程问答--------------------
引用 28 楼 simple870617 的回复:


sigh。。。说了半天你根本没看懂我的意思。
如果不是考虑到这些帖子可能会有别人看,真后悔跟你说这么多。
拜托你仔细看看我在16楼说的登录策略。 --------------------编程问答--------------------
引用 14 楼 jlj84237485 的回复:
帮顶一下

过来看看…… --------------------编程问答--------------------
引用 31 楼 Moosdau 的回复:
引用 28 楼 simple870617 的回复:
 

sigh。。。说了半天你根本没看懂我的意思。 
如果不是考虑到这些帖子可能会有别人看,真后悔跟你说这么多。 
拜托你仔细看看我在16楼说的登录策略。

你这种类似QQ的登入策略我们不能用,要不就不会这么复杂了。
拜托你看清楚我的问题
--------------------编程问答-------------------- 这样搞 实在是 增加服务器的负担! --------------------编程问答-------------------- 帮顶一下 --------------------编程问答-------------------- 看来只有做定时的刷新来判断了 --------------------编程问答-------------------- 高人来呀- - --------------------编程问答-------------------- 高人来呀- - --------------------编程问答-------------------- 问问CSDN怎么搞的 --------------------编程问答-------------------- 对于一个帐号在同一时间只能一个人登录,可以通过下面的方法实现:
1 .在用户登录时,把用户添加到一个ArrayList中
2 .再次登录时查看ArrayList中有没有该用户,如果ArrayList中已经存在该用户,则阻止其登录
3 .当用户退出时,需要从该ArrayList中删除该用户,这又分为三种情况
① 使用注销按钮正常退出
② 点击浏览器关闭按钮或者用Alt+F4退出,可以用javascript捕捉该页面关闭事件, 
执行一段方法删除ArrayList中的用户 
③ 非正常退出,比如客户端系统崩溃或突然死机,可以采用隔一段时间session没活动就删除该session所对应的用户来解决,这样用户需要等待一段时间之后就可以正常登录。 


出自:http://bbs.chinajavaworld.com/message.jspa?messageID=771857#771857
以上是部分代码全部代码在http://www.java125.cn/article.asp?id=867  --------------------编程问答-------------------- session_end事件 --------------------编程问答-------------------- 楼主,你这个办法好猥琐。 --------------------编程问答--------------------
引用 31 楼 Moosdau 的回复:
引用 28 楼 simple870617 的回复:
 

sigh。。。说了半天你根本没看懂我的意思。 
如果不是考虑到这些帖子可能会有别人看,真后悔跟你说这么多。 
拜托你仔细看看我在16楼说的登录策略。



你的策略确实不能用,因为当A 用户A地方登入随即码是1234写入数据库(同时自身记录了这个随即码),A用户B地方登入随即码4321(应该也要写入库把,一样记录随即码)

这时候你还得判断也就是A 用户A地方在每次使用某个功能比如添加商品,你就要去比对数据库的随即码有没有被更改过,有的话那么就提示被破下线,没有被更改那就继续使用。

这样的话耗费的资源也是非常大的 --------------------编程问答-------------------- 普通的b/s程序,服务器是不清楚客户的状态。
如果知道,只能客户主动通知服务器
要想解决你这种方式,也就是想办法让客户主动给服务器发消息。
一些安全性高的软件,如银行的都是在客户机上加了程序来通知服务器
可以让客户机存有临时生成的认证信息。如果断电,重启,可以根据认证信息来重新生成新登录。
我想,这样可以解决,要达到你要的那种效果,工作量不会很小。

--------------------编程问答-------------------- 简单的做法

表里应该有这样的两个字段:记录登入时间和是否在线

用户登入时

先检查是否在线,如果在线则验证其登入时间,如果登入时间超过某个特定的时间,那么认为是非正常模式推出,则认定此时用户不在线

执行正常的登入操作

PS:这个方案也有弊端,但应该可以接受 --------------------编程问答--------------------
引用 45 楼 NqIceCoffee 的回复:
简单的做法 

表里应该有这样的两个字段:记录登入时间和是否在线 

用户登入时 

先检查是否在线,如果在线则验证其登入时间,如果登入时间超过某个特定的时间,那么认为是非正常模式推出,则认定此时用户不在线 

执行正常的登入操作 

PS:这个方案也有弊端,但应该可以接受


方法的弊端在于人性化程度不高 --------------------编程问答-------------------- 为什么没人提application,这个只要你登陆了加载进来就可以了啊,访问量大的虽然比较耗资源,但我估计楼主的访问量应该不是太大的商业网站把! --------------------编程问答-------------------- Application的原理是在服务器端建立一个状态变量,来存储所需的信息。要注意的是,首先,这个状态变量是建立在内存中的,其次是这个状态变量是可以被网站的所有页面访问的。这就意味着它只能存储一些要公布的信息,而不能存储一些比较个人的信息了!
我认为Application还不是很合适。 --------------------编程问答-------------------- 感觉楼主好像是在做一个游戏的用户登陆,如果一个用户登陆之后,就不能在登陆的话,假如不是真正的用户本人登陆,而用户本人要登陆的话,却登陆不了,那就出现问题了,感觉如果真的要这样也有点不合理,
如果真的要这样做的话,感觉就采用随机码,当用户第一次登陆的时候,给他一个随机码,存如数据库,并用一个session来进行判断间隔时间可以设置小一点,如果用户出现断电,死机的话,就在代码里边写一个判断如果用户正常离开网页,清空下session如果不是那就是非正常推出,等用户第二次登陆的时候,在判断用户名和密码正确的前提下,再给他一个随机码,这个时候你判断session如果不为空,并且和上次的随机码不一样,那就提示他用户在登陆,如果为空,就写如数据库,为登陆状态,
如果一个用户名只能登陆一个的话,那就可以模仿下QQ的登陆,如果一个登陆了,那么在登陆的就被T下线, --------------------编程问答-------------------- 说一句实话,就是微软的MemberShip提供的方法也不能令人满意(他使用的是时间戳). --------------------编程问答-------------------- UP一下~ --------------------编程问答-------------------- Mark... --------------------编程问答--------------------
引用 4 楼 simple870617 的回复:
LSD的我也想过 
就是不停和服务器进行数据验证 如果没有数据验证 就判断退出 
但是这样我怕影响性能或者速度 
不知道有什么其他方法没



其实也不会太耗费资源了,不过几个字节的数据验证。
如果你的在线人数不多的话是可以的。

我想如果你在线人数多的话,不会用这种比较变态的算法的。

估计你是给政府做业务的。 --------------------编程问答-------------------- 要做到时实性
貌似就只有不停和服务器发送数据验证了

实在是不知道怎么搞了。 --------------------编程问答--------------------
引用 49 楼 yangniao 的回复:
感觉楼主好像是在做一个游戏的用户登陆,如果一个用户登陆之后,就不能在登陆的话,假如不是真正的用户本人登陆,而用户本人要登陆的话,却登陆不了,那就出现问题了,感觉如果真的要这样也有点不合理, 
如果真的要这样做的话,感觉就采用随机码,当用户第一次登陆的时候,给他一个随机码,存如数据库,并用一个session来进行判断间隔时间可以设置小一点,如果用户出现断电,死机的话,就在代码里边写一个判断如果用户正常离开…

和队友商量了下,准备这样做.. --------------------编程问答-------------------- UP一下~ --------------------编程问答--------------------
引用 16 楼 Moosdau 的回复:
用最新的登录会覆盖旧的登录。就是新登入的人往数据库写一个登录随机码,并且这个随机保存在登录信息中,这样,以前登录的人验证的时候,会发现和当前随机码不同,他就登录失效了。这样就可以保证只有一个人能登入。 

用这种模式的比如QQ,第二个登录的人会使第一个人离线。 

其实这样设置是合理的,因为一个帐户只应该由一个人保管密码。

顶一下! --------------------编程问答-------------------- 用 Application  是全局的    --------------------编程问答-------------------- 顶下
学习....................... --------------------编程问答-------------------- 学习了! --------------------编程问答-------------------- 单点登陆 baidu下 各种方法很多 目前好象没有很完美的解决方案 --------------------编程问答-------------------- 用session应该就能搞定了啊! --------------------编程问答-------------------- 引用 24 楼 Moosdau 的回复: 
为什么要判断他非正常退出呢? 
你的系统应该能够保证他只能从登陆页面进入,如果他关闭了浏览器,就只好重新登录,只要重新登录就会生成新的登录随机码,他爱非常退出就随他便。 

非正常退出就是说用户关了。 浏览器。 。   当你在断电的时候。 电脑都关了。 那浏览器肯定不会存在。。 这样说可以把这样的情况视为用户退出。 
这样就可以起到作用。。。 

个人意见。 路过



--------------------编程问答-------------------- 引用 24 楼 Moosdau 的回复: 
为什么要判断他非正常退出呢? 
你的系统应该能够保证他只能从登陆页面进入,如果他关闭了浏览器,就只好重新登录,只要重新登录就会生成新的登录随机码,他爱非常退出就随他便。 

非正常退出就是说用户关了。 浏览器。 。   当你在断电的时候。 电脑都关了。 那浏览器肯定不会存在。。 这样说可以把这样的情况视为用户退出。 
这样就可以起到作用。。。 

个人意见。 路过



--------------------编程问答-------------------- 学习了! --------------------编程问答--------------------
引用 3 楼 che2piaopiao 的回复:
目前为止最好的方法: Session 

然后在Sesssion_end里写事件. 


理由:如果用别的方法,客户端如果突然断电会怎么办?这样,一个用户的信息就不能正确的获取. 


注明: 在Session_end里还是能取到超时的Session值的,所以,推荐楼主用这种方法喽

这是最好的了 --------------------编程问答--------------------
引用 11 楼 liujiayu10 的回复:
一般用AJAX定时向服务器发送数据,比如几点几分几秒,某某用户名,在线,服务器端更新用户最后发送时的数据,如果用户最后发送时间与现在比大于5分钟(自己可以随便设定)就可以表示为用户已经离线了

这个应该是比较好的解决方案了。
但是如果并发量比较小的话,这样做可以;如果并发量像CSDN这么大的话,这么做会增加服务器的负担。除非你另做服务器放webservice。
如上面一位朋友所说,主要是找不到一个比较好的判断用户退出的的条件。 --------------------编程问答-------------------- 这个方法貌似无论什么情况下,后登录的总能取代先登录的,先登录的能得到提示信息,并选择是否接受退出吗? --------------------编程问答--------------------
引用 16 楼 Moosdau 的回复:
用最新的登录会覆盖旧的登录。就是新登入的人往数据库写一个登录随机码,并且这个随机保存在登录信息中,这样,以前登录的人验证的时候,会发现和当前随机码不同,他就登录失效了。这样就可以保证只有一个人能登入。

用这种模式的比如QQ,第二个登录的人会使第一个人离线。

其实这样设置是合理的,因为一个帐户只应该由一个人保管密码。


这个方法貌似无论什么情况下,后登录的总能取代先登录的,先登录的能得到提示信息,并选择是否接受退出吗? --------------------编程问答-------------------- 那就用profile,登陆的时候保存用户名,登陆日期,第几次登陆,注销日期,在线状态。
当用户正常登陆,更新登陆日期,第几次登陆,在线状态
当用户正常退出,更新注销日期,在线状态

当用户再登陆就判断旧注销日期>旧登陆日期。
                 符合(正常退出),更新登陆日期,第几次登陆,在线状态。
                 不符合(非正常退出,或者同一帐号两人同时登陆)。
                 再判断在线状态,真,提示您的帐号已经登陆,退出。
                 假(断电等情况),进入正常登陆页面。



-------初学ASP.NET,与大家交流。 --------------------编程问答-------------------- up --------------------编程问答--------------------
引用 10 楼 greatchao88 的回复:
登陆了就不让再登陆了 
这种设计有什么好处呢?


在超市商场收钱时需要这种要求。 --------------------编程问答-------------------- mark --------------------编程问答-------------------- 1、在数据库中增加一个在线表,包含登陆人最后一次操作时间(登陆时间)
2、创建一个存储过程往这个在线表中插入数据,同时增加一个步骤,当最后一次操作时间大于当前时间30分钟,可以删除,
每次可判断此表 --------------------编程问答-------------------- 顶  75楼 --------------------编程问答--------------------
引用 16 楼 moosdau 的回复:
用最新的登录会覆盖旧的登录。就是新登入的人往数据库写一个登录随机码,并且这个随机保存在登录信息中,这样,以前登录的人验证的时候,会发现和当前随机码不同,他就登录失效了。这样就可以保证只有一个人能登入。

用这种模式的比如QQ,第二个登录的人会使第一个人离线。

其实这样设置是合理的,因为一个帐户只应该由一个人保管密码。


这个方法好
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,