当前位置:编程学习 > JAVA >>

Java 如何控制用户重复登陆?


只允许一个登陆用户处于在线状态. --------------------编程问答-------------------- 数据库加flag 。。 --------------------编程问答-------------------- 将登录用户信息存放到session里,每个登录用户登录验证成功后判断session种是否存在该用户,存在则给出提示信息,不存在则使用系统 --------------------编程问答-------------------- 在登录页就判断如果存在用户的session就直接进首页,否则就可以在登录页进行登陆 --------------------编程问答-------------------- 我想楼主是想知道,不在数据库加个字段吧,这个SESSION只对浏览器有作用,如果别人在另一台机上登录呢,要是不能挤下线的怎么搞呢?? --------------------编程问答-------------------- 加个FILTER或者用个SESSION用到底。。。 --------------------编程问答-------------------- 我觉得楼主判断session里的用户名是不是和已知的一样就可以了 --------------------编程问答-------------------- 不能在SESSION中做吧~只能在APPLICATION中做·数据库吧,反正验证用户密码正常都是从数据库取的,不妨多拿一个字段· --------------------编程问答-------------------- 限制登录的人数哦 --------------------编程问答-------------------- 如果你想只允许第一个用户登录的话,可以存点信息在数据库里,比如说用户名,用户登陆时查找这个用户名是否已经登陆,如果是则不允许登录。

如果你想让后来的登录者把前一个登录者踢下线,则需要存储session ID,用户名可以存在数据库,也可以使用保存在session里的那个。当新用户登陆的时候,搜索这个用户名是否已登录,如果是,则找到相应session ID,把它invalidate,然后再把新的session ID存入数据库。

第一个方法需要在用户进行任何操作的时候即时更新数据库里用户的时间,然后用一个cron job检查这个用户名存在是不是超过了设定的时间,然后决定是否把这个用户删除。(如果把session ID也存上就简单多了)

第二个方法只要用cron job定期检查每个session是否还活着就可以了,如果session已死,就把数据库里相应记录删除 --------------------编程问答-------------------- --------------------编程问答-------------------- 我也想弄明白这个机制,有没有更好的解决方法,数据库里存状态,要是 IE 非法关闭勒,数据库里怎么恢复状态啊? --------------------编程问答--------------------
引用 11 楼 minglois 的回复:
我也想弄明白这个机制,有没有更好的解决方法,数据库里存状态,要是 IE 非法关闭勒,数据库里怎么恢复状态啊?


如果用一个cron job每分钟检测session状态的话,一旦发现session不再存在就删除这条记录。

但这并非一个很好的办法,所以我比较倾向于后登陆用户挤掉先登陆用户,这样不论是服务器突然停电或者客户端电脑失火都不会影响到下一次的登陆。 --------------------编程问答-------------------- 在数据库中设置一个标志位,这个方法我个人认为很不错 --------------------编程问答-------------------- token表 --------------------编程问答-------------------- 首先设置一个静态变量,或是放在Application里面, 总之要保证是全局的. 当用户登录的时候将用户名和登陆艇录时间记录下来;当用户正常退出的时候,清除掉该用户在全局环境里的信息. 如果用户是非正常退出的,那就要再写一个FILTER了, 这也就是为什么在登录的时候要记下时间了.  --------------------编程问答-------------------- 放application里面保存各用户的session属性且用name做标签键,再比较是否为最新的application属性值,不是就每个操作都返回初始页面 --------------------编程问答-------------------- 个人认为还是#9楼的方法可取。。 --------------------编程问答-------------------- 个人认为最合适通用的方法还是在数据库里加个flag字段。
至于有说在appliacation层里加登陆信息做验证,这个方法只适合少量用户的登陆使用,如果用户量相当多,那么会造成系统资源紧缺。 --------------------编程问答-------------------- session 控制不懂 --------------------编程问答-------------------- 可以用到struts中的令牌机制 --------------------编程问答-------------------- 可以再web.xml文件里面配置一个Filter,设置一个标志位就可以了…… --------------------编程问答--------------------   上次不是有帖子专门讨论过了吗  --------------------编程问答--------------------
引用 22 楼 bolink5 的回复:
  上次不是有帖子专门讨论过了吗

这次接着讨论 --------------------编程问答--------------------
引用 12 楼 daisycool 的回复:
引用 11 楼 minglois 的回复:
 我也想弄明白这个机制,有没有更好的解决方法,数据库里存状态,要是 IE 非法关闭勒,数据库里怎么恢复状态啊?


 如果用一个cron job每分钟检测session状态的话,一旦发现session不再存在就删除这条记录。

 但这并非一个很好的办法,所以我比较倾向于后登陆用户挤掉先登陆用户,这样不论是服务器突然停电或者客户端电脑失火都不会影响到下一次的登陆。

顶 --------------------编程问答-------------------- session不保险,重开一个浏览器窗口照样能登录。保险的做法是有数据库一个全局登录信息表,记录用户登录信息,并加状态值,登录时判断状态值。 --------------------编程问答-------------------- 给分吧。 --------------------编程问答--------------------
引用 25 楼 chenlei65368 的回复:
session不保险,重开一个浏览器窗口照样能登录。保险的做法是有数据库一个全局登录信息表,记录用户登录信息,并加状态值,登录时判断状态值。


你的办法很普通,先看看别人的回贴吧 --------------------编程问答-------------------- 如果你不想像QQ那样的硬踹方式,可以尝试以下思想,采用心跳方式,可以采用ajax方式来实现:
当用户登陆以后,此用户的页面,每两秒钟向服务器发送一个notify,表明自己还活着,后台的Servelet在map中记下“user-lastNotifyTime".
第二个页面登陆时,Servelet会从map中检索,看看有没有记录:
如果没有记录,为第一次登陆,则允许登陆。
如果有记录,则看上次notify时间与相在时间相差是否超过了4秒.如果超过了,说明上个session已经非正常死掉,允许用户登陆,否则说明上个session还活着,则不允许登陆。 --------------------编程问答--------------------
引用 28 楼 yekai012 的回复:
如果你不想像QQ那样的硬踹方式,可以尝试以下思想,采用心跳方式,可以采用ajax方式来实现:
 当用户登陆以后,此用户的页面,每两秒钟向服务器发送一个notify,表明自己还活着,后台的Servelet在map中记下“user-lastNotifyTime".
 第二个页面登陆时,Servelet会从map中检索,看看有没有记录:
 如果没有记录,为第一次登陆,则允许登陆。
 如果有记录,则看上次notify时间与相在时间相差是否超过了4秒.如果超过了,说明上个session已经非正常死掉,允许用户登陆,否则说明上个session还活着,则不允许登陆。


3个缺点

1 不断的占用网络资源,虽然非常非常的小,但能避免则应当避免

2 致命之处在于一旦出现网络暂时堵塞,或者掉线,或者不小心进入了其他网页,超过这个”心跳“时间就可能会导致另一个用户抢先登录,甚至当操作系统进行其他大负荷操作时也可能导致这个信息不能及时发出。这样也可以成为被攻击的漏洞之一

3 如果用这种方法,那每一个页面上都需要有一个javascript不断的联系服务器,一旦忘记添加这个功能则在此页面浏览的时候就可能被第二个用户登录 --------------------编程问答--------------------
引用 2 楼 chong023 的回复:
将登录用户信息存放到session里,每个登录用户登录验证成功后判断session种是否存在该用户,存在则给出提示信息,不存在则使用系统


session不对

两种解决方案
1.登陆成功放入application 中 
2.登陆成功后改用户状态在数据库中。 --------------------编程问答--------------------
引用 29 楼 daisycool 的回复:
引用 28 楼 yekai012 的回复:
如果你不想像QQ那样的硬踹方式,可以尝试以下思想,采用心跳方式,可以采用ajax方式来实现:
当用户登陆以后,此用户的页面,每两秒钟向服务器发送一个notify,表明自己还活着,后台的Servelet在map中记下“user-lastNotifyTime".
第二个页面登陆时,Servelet会从map中检索,看看有没有记录:
如果没有记录,为第一次登陆,则允许登陆。
如果有记录,则看上次notify时间与相在时间相差是否超过了4秒.如果超过了,说明上个session已经非正常死掉,允许用户登陆,否则说明上个session还活着,则不允许登陆。


3个缺点

1 不断的占用网络资源,虽然非常非常的小,但能避免则应当避免

2 致命之处在于一旦出现网络暂时堵塞,或者掉线,或者不小心进入了其他网页,超过这个”心跳“时间就可能会导致另一个用户抢先登录,甚至当操作系统进行其他大负荷操作时也可能导致这个信息不能及时发出。这样也可以成为被攻击的漏洞之一

3 如果用这种方法,那每一个页面上都需要有一个javascript不断的联系服务器,一旦忘记添加这个功能则在此页面浏览的时候就可能被第二个用户登录


1. 特殊功能是要付出特殊代价的,现在的网络也不是你想像的那样遭。如果像你说的那样,聊天室系统早就完蛋了。
2. 可以借助将Token传到客户端的做法来进行改善,只要第二个用户没有登陆,连接可以通过token来恢复,但你必须明白,HTTP是无状态的,超过这个范围的需求是异想天开。
3. 这种情况怪不得别人,自己抽自己吧。 --------------------编程问答-------------------- 用session 控制比较好! --------------------编程问答--------------------
引用 31 楼 yekai012 的回复:
引用 29 楼 daisycool 的回复:
 引用 28 楼 yekai012 的回复:
 如果你不想像QQ那样的硬踹方式,可以尝试以下思想,采用心跳方式,可以采用ajax方式来实现:
 当用户登陆以后,此用户的页面,每两秒钟向服务器发送一个notify,表明自己还活着,后台的Servelet在map中记下“user-lastNotifyTime".
 第二个页面登陆时,Servelet会从map中检索,看看有没有记录:
 如果没有记录,为第一次登陆,则允许登陆。
 如果有记录,则看上次notify时间与相在时间相差是否超过了4秒.如果超过了,说明上个session已经非正常死掉,允许用户登陆,否则说明上个session还活着,则不允许登陆。


 3个缺点

 1 不断的占用网络资源,虽然非常非常的小,但能避免则应当避免

 2 致命之处在于一旦出现网络暂时堵塞,或者掉线,或者不小心进入了其他网页,超过这个”心跳“时间就可能会导致另一个用户抢先登录,甚至当操作系统进行其他大负荷操作时也可能导致这个信息不能及时发出。这样也可以成为被攻击的漏洞之一

 3 如果用这种方法,那每一个页面上都需要有一个javascript不断的联系服务器,一旦忘记添加这个功能则在此页面浏览的时候就可能被第二个用户登录


 1. 特殊功能是要付出特殊代价的,现在的网络也不是你想像的那样遭。如果像你说的那样,聊天室系统早就完蛋了。
 2. 可以借助将Token传到客户端的做法来进行改善,只要第二个用户没有登陆,连接可以通过token来恢复,但你必须明白,HTTP是无状态的,超过这个范围的需求是异想天开。
 3. 这种情况怪不得别人,自己抽自己吧。


1. 说实话我没看到这种方法的任何优点。网络是足够强大,但这种方法并没有什么特别好的地方,为什么要作无谓的浪费呢?
2. 这些冗赘的操作都是不必要的,为什么要把事情变复杂?
3. 这并不是抽不抽自己的问题,而是增加了程序出现bug的危险性,提高了系统的维护、升级和二次开发的难度

数据库结合session就可以得到安全有效的解决方式。把系统权限验证的功能依赖在不断的S/C信息交换上,我认为这可以算一种方案,但不能算一个聪明的做法。 --------------------编程问答--------------------
引用 33 楼 daisycool 的回复:
引用 31 楼 yekai012 的回复:
引用 29 楼 daisycool 的回复:
引用 28 楼 yekai012 的回复:
如果你不想像QQ那样的硬踹方式,可以尝试以下思想,采用心跳方式,可以采用ajax方式来实现:
当用户登陆以后,此用户的页面,每两秒钟向服务器发送一个notify,表明自己还活着,后台的Servelet在map中记下“user-lastNotifyTime".
第二个页面登陆时,Servelet会从map中检索,看看有没有记录:
如果没有记录,为第一次登陆,则允许登陆。
如果有记录,则看上次notify时间与相在时间相差是否超过了4秒.如果超过了,说明上个session已经非正常死掉,允许用户登陆,否则说明上个session还活着,则不允许登陆。


3个缺点

1 不断的占用网络资源,虽然非常非常的小,但能避免则应当避免

2 致命之处在于一旦出现网络暂时堵塞,或者掉线,或者不小心进入了其他网页,超过这个”心跳“时间就可能会导致另一个用户抢先登录,甚至当操作系统进行其他大负荷操作时也可能导致这个信息不能及时发出。这样也可以成为被攻击的漏洞之一

3 如果用这种方法,那每一个页面上都需要有一个javascript不断的联系服务器,一旦忘记添加这个功能则在此页面浏览的时候就可能被第二个用户登录


1. 特殊功能是要付出特殊代价的,现在的网络也不是你想像的那样遭。如果像你说的那样,聊天室系统早就完蛋了。
2. 可以借助将Token传到客户端的做法来进行改善,只要第二个用户没有登陆,连接可以通过token来恢复,但你必须明白,HTTP是无状态的,超过这个范围的需求是异想天开。
3. 这种情况怪不得别人,自己抽自己吧。


1. 说实话我没看到这种方法的任何优点。网络是足够强大,但这种方法并没有什么特别好的地方,为什么要作无谓的浪费呢?
2. 这些冗赘的操作都是不必要的,为什么要把事情变复杂?
3. 这并不是抽不抽自己的问题,而是增加了程序出现bug的危险性,提高了系统的维护、升级和二次开发的难度

数据库结合session就可以得到安全有效的解决方式。把系统权限验证的功能依赖在不断的S/C信息交换上,我认为这可以算一种方案,但不能算一个聪明的做法。


Http是长连接还是短连接?session是存在服务器端的,而且是有一定的有效时间的,我在任务管理器中直接把IE干掉,你能马上检查出我的session无效了?我再开IE你不让我登陆?

如果你的方法解决不了这些问题,不要说别人做的是无用功,解决问题是王道。至于你说的什么维护难度等,我觉得是什么不存的事,做成一个公共模块是众所周知的事,而且是可以提高复用性的。 --------------------编程问答-------------------- --------------------编程问答-------------------- 用session判断 --------------------编程问答--------------------
引用 34 楼 yekai012 的回复:
 Http是长连接还是短连接?session是存在服务器端的,而且是有一定的有效时间的,我在任务管理器中直接把IE干掉,你能马上检查出我的session无效了?我再开IE你不让我登陆?

 如果你的方法解决不了这些问题,不要说别人做的是无用功,解决问题是王道。至于你说的什么维护难度等,我觉得是什么不存的事,做成一个公共模块是众所周知的事,而且是可以提高复用性的。


楼上的太激动了。无意和你争辩什么,你觉得自己的方法好就去用它,我没有说你的方法是无用功,不过是从设计和系统维护的角度说说我的想法。单纯解决问题不是真正的王道,有效的解决问题才是目标。 --------------------编程问答--------------------
引用 6 楼 shihuaxian 的回复:
我觉得楼主判断session里的用户名是不是和已知的一样就可以了

支持 --------------------编程问答--------------------
引用 37 楼 daisycool 的回复:
引用 34 楼 yekai012 的回复:


  Http是长连接还是短连接?session是存在服务器端的,而且是有一定的有效时间的,我在任务管理器中直接把IE干掉,你能马上检查出我的session无效了?我再开IE你不让我登陆?

  如果你的方法解决不了这些问题,不要说别人做的是无用功,解决问题是王道。至于你说的什么维护难度等,我觉得是什么不存的事,做成一个公共模块是众所周知的事,而且是可以提高复用性的。


 楼上的太激动了。无意和你争辩什么,你觉得自己的方法好就去用它,我没有说你的方法是无用功,不过是从设计和系统维护的角度说说我的想法。单纯解决问题不是真正的王道,有效的解决问题才是目标。

-----------------------我也从设计角度上来说吧---------------------

    从设计角度上来说,楼主的需求本身就是不合理的,因为Http是短连接且无状态的,有人提到了session,session的实时性要差,更有人提到了数据库,这个我是彻底反对了,原因就是你无法保证数据总是同步的。
    但有时候客户是不讲理的,和他们讲设计是没有用的,出于特殊情况就要特殊处理,这种情况下已经不能再列扣设计,当然如果按设计模式做会更好。但是前提是什么?
    -----软件的第一要素是什么?首先是能解问题,解决不了问题还要他做什么。所以,当你的做法无法通过所有的测试case的情况下,说明你的方法解决不了问题,问题都解决不了的情况下,你和别人说设计,显然是不切实际的。
    
--------------------编程问答-------------------- 樓上的講得好!!! --------------------编程问答-------------------- 数据库写一个标志,在线的时候为0.下线的时候为1 --------------------编程问答--------------------
引用 39 楼 yekai012 的回复:
引用 37 楼 daisycool 的回复:
引用 34 楼 yekai012 的回复:


  Http是长连接还是短连接?session是存在服务器端的,而且是有一定的有效时间的,我在任务管理器中直接把IE干掉,你能马上检查出我的session无效了?我再开IE你不让我登陆?

  如果你的方法解决不了这些问题,不要说别人做的是无用功,解决问题是王道。至于你说的什么维护难度等,我觉得是什么不存的事,做成一个公共模块是众所周知的事,而且是可以提高复用性的。


楼上的太激动了。无意和你争辩什么,你觉得自己的方法好就去用它,我没有说你的方法是无用功,不过是从设计和系统维护的角度说说我的想法。单纯解决问题不是真正的王道,有效的解决问题才是目标。

-----------------------我也从设计角度上来说吧---------------------

    从设计角度上来说,楼主的需求本身就是不合理的,因为Http是短连接且无状态的,有人提到了session,session的实时性要差,更有人提到了数据库,这个我是彻底反对了,原因就是你无法保证数据总是同步的。
    但有时候客户是不讲理的,和他们讲设计是没有用的,出于特殊情况就要特殊处理,这种情况下已经不能再列扣设计,当然如果按设计模式做会更好。但是前提是什么?
    -----软件的第一要素是什么?首先是能解问题,解决不了问题还要他做什么。所以,当你的做法无法通过所有的测试case的情况下,说明你的方法解决不了问题,问题都解决不了的情况下,你和别人说设计,显然是不切实际的。
   

你的方法确实有楼主说的弊端的,你很偏执,既然讨论,你给出方案,我想楼主还是高兴的,大家都心平气和思考就行了 --------------------编程问答--------------------
引用 9 楼 daisycool 的回复:
如果你想只允许第一个用户登录的话,可以存点信息在数据库里,比如说用户名,用户登陆时查找这个用户名是否已经登陆,如果是则不允许登录。

如果你想让后来的登录者把前一个登录者踢下线,则需要存储session ID,用户名可以存在数据库,也可以使用保存在session里的那个。当新用户登陆的时候,搜索这个用户名是否已登录,如果是,则找到相应session ID,把它invalidate,然后再把新的session ID存入数据库。

第一个方法需要在用户进行任何操作的时候即时更新数据库里用户的时间,然后用一个cron job检查这个用户名存在是不是超过了设定的时间,然后决定是否把这个用户删除。(如果把session ID也存上就简单多了)

第二个方法只要用cron job定期检查每个session是否还活着就可以了,如果session已死,就把数据库里相应记录删除


比较赞同第二个方案,第一个比较麻烦,要对非法关闭等情况进行判断,第二种方法相对好一些,尽管是后登陆者上线. --------------------编程问答--------------------
引用 42 楼 wuhaiyangdh 的回复:
引用 39 楼 yekai012 的回复:
引用 37 楼 daisycool 的回复:
引用 34 楼 yekai012 的回复:


  Http是长连接还是短连接?session是存在服务器端的,而且是有一定的有效时间的,我在任务管理器中直接把IE干掉,你能马上检查出我的session无效了?我再开IE你不让我登陆?

  如果你的方法解决不了这些问题,不要说别人做的是无用功,解决问题是王道。至于你说的什么维护难度等,我觉得是什么不存的事,做成一个公共模块是众所周知的事,而且是可以提高复用性的。


楼上的太激动了。无意和你争辩什么,你觉得自己的方法好就去用它,我没有说你的方法是无用功,不过是从设计和系统维护的角度说说我的想法。单纯解决问题不是真正的王道,有效的解决问题才是目标。

-----------------------我也从设计角度上来说吧---------------------

    从设计角度上来说,楼主的需求本身就是不合理的,因为Http是短连接且无状态的,有人提到了session,session的实时性要差,更有人提到了数据库,这个我是彻底反对了,原因就是你无法保证数据总是同步的。
    但有时候客户是不讲理的,和他们讲设计是没有用的,出于特殊情况就要特殊处理,这种情况下已经不能再列扣设计,当然如果按设计模式做会更好。但是前提是什么?
    -----软件的第一要素是什么?首先是能解问题,解决不了问题还要他做什么。所以,当你的做法无法通过所有的测试case的情况下,说明你的方法解决不了问题,问题都解决不了的情况下,你和别人说设计,显然是不切实际的。
   
你的方法确实有楼主说的弊端的,你很偏执,既然讨论,你给出方案,我想楼主还是高兴的,大家都心平气和思考就行了

------------------------------
先弄清哪个是楼主吧!

弊端不弊端是和你的需求联系在一起的,如果你要是拿新闻系统来衡量我的方案,我无话可说。但是,如果楼主的需求本身就是一个聊天室呢?实时交互是很必然的。

我只所以这么设计是因为:Http主要是短连接无状态的,虽然利用session可以来追踪会话,但session的失效是有一定时间的,实时性要差,用心跳的办法可以来改善短连接和实时性。

至于说到网络阻塞上,一方面可以通过策略来改善:比如:虽然当前用户超时了,但由于没有当前用户但可以确定只有一处登陆,是可以信任的,会话继续。

至于说的到别的网页上去了,那是用户自己的事,如果他幸运的话(比如没有此帐号在别处登陆),可以通过上面说的策略恢复。如果倒霉,那也是正常。

还有其它什么维护难度啊,复杂度啊这些那是自己的事,自己做不了,不一定别人做不了,(richfaces里面早已做的挺好了,完全可以直接拿过来用),这个不是借口 (事实上也真没有什么难度)。

最后说一句:不是我偏执,我们进行WEB开发,就要按WEB的原理、规范去做,不要拿C/S的标准去衡量B/S开发。 --------------------编程问答--------------------
引用 44 楼 yekai012 的回复:
引用 42 楼 wuhaiyangdh 的回复:
 引用 39 楼 yekai012 的回复:
 引用 37 楼 daisycool 的回复:
 引用 34 楼 yekai012 的回复:


   Http是长连接还是短连接?session是存在服务器端的,而且是有一定的有效时间的,我在任务管理器中直接把IE干掉,你能马上检查出我的session无效了?我再开IE你不让我登陆?

   如果你的方法解决不了这些问题,不要说别人做的是无用功,解决问题是王道。至于你说的什么维护难度等,我觉得是什么不存的事,做成一个公共模块是众所周知的事,而且是可以提高复用性的。


 楼上的太激动了。无意和你争辩什么,你觉得自己的方法好就去用它,我没有说你的方法是无用功,不过是从设计和系统维护的角度说说我的想法。单纯解决问题不是真正的王道,有效的解决问题才是目标。

 -----------------------我也从设计角度上来说吧---------------------

     从设计角度上来说,楼主的需求本身就是不合理的,因为Http是短连接且无状态的,有人提到了session,session的实时性要差,更有人提到了数据库,这个我是彻底反对了,原因就是你无法保证数据总是同步的。
     但有时候客户是不讲理的,和他们讲设计是没有用的,出于特殊情况就要特殊处理,这种情况下已经不能再列扣设计,当然如果按设计模式做会更好。但是前提是什么?
     -----软件的第一要素是什么?首先是能解问题,解决不了问题还要他做什么。所以,当你的做法无法通过所有的测试case的情况下,说明你的方法解决不了问题,问题都解决不了的情况下,你和别人说设计,显然是不切实际的。

 你的方法确实有楼主说的弊端的,你很偏执,既然讨论,你给出方案,我想楼主还是高兴的,大家都心平气和思考就行了

 ------------------------------
 先弄清哪个是楼主吧!

 弊端不弊端是和你的需求联系在一起的,如果你要是拿新闻系统来衡量我的方案,我无话可说。但是,如果楼主的需求本身就是一个聊天室呢?实时交互是很必然的。

 我只所以这么设计是因为:Http主要是短连接无状态的,虽然利用session可以来追踪会话,但session的失效是有一定时间的,实时性要差,用心跳的办法可以来改善短连接和实时性。

 至于说到网络阻塞上,一方面可以通过策略来改善:比如:虽然当前用户超时了,但由于没有当前用户但可以确定只有一处登陆,是可以信任的,会话继续。

 至于说的到别的网页上去了,那是用户自己的事,如果他幸运的话(比如没有此帐号在别处登陆),可以通过上面说的策略恢复。如果倒霉,那也是正常。

 还有其它什么维护难度啊,复杂度啊这些那是自己的事,自己做不了,不一定别人做不了,(richfaces里面早已做的挺好了,完全可以直接拿过来用),这个不是借口 (事实上也真没有什么难度)。

 最后说一句:不是我偏执,我们进行WEB开发,就要按WEB的原理、规范去做,不要拿C/S的标准去衡量B/S开发。


呵呵! --------------------编程问答-------------------- 易做图+sessionFactory
--------------------编程问答-------------------- 关键是你怎么判断用户退出登录 --------------------编程问答-------------------- 用session的登录变量判断登陆次数是否大于1 --------------------编程问答-------------------- 围观上面二位大牛的辩论,偷点料学! --------------------编程问答-------------------- --------------------编程问答-------------------- 在数据库中加一个Flag标记吧,第一个登陆成功后将flag改为true。在登录时如果验证成功就检查这个flag标记如果为true的话,就禁止登陆了。
当然,在正常的退出后或session对象过期后就将flag标记改为false。 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 现在也遇到了这样的问题,思考中。。。。。 --------------------编程问答-------------------- 楼主不厚道,还不结贴 --------------------编程问答-------------------- 讨论了大半天楼主到底是怎么解决的啊。 --------------------编程问答-------------------- 别鸡洞   !!!  和谐社会讲究的是淡定。 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------
有一个接口叫 SESSION 监听的什么来着 实现它 有一个方法就是在 SESSION消亡前的一个方法 可以在这个方法里 对数据库那个字段进行操作。 --------------------编程问答-------------------- 好多牛人 --------------------编程问答-------------------- 在数据库中添加一个字段:如登陆时间,并将此时间记录在session,使用的时候验证
不同就直接T --------------------编程问答--------------------
引用 12 楼 daisycool 的回复:
引用 11 楼 minglois 的回复:
我也想弄明白这个机制,有没有更好的解决方法,数据库里存状态,要是 IE 非法关闭勒,数据库里怎么恢复状态啊?


如果用一个cron job每分钟检测session状态的话,一旦发现session不再存在就删除这条记录。

但这并非一个很好的办法,所以我比较倾向于后登陆用户挤掉先登陆用户,这样不论是服务器突然停电或者客户端电脑失火都不会影响到……

你就这样试试 --------------------编程问答-------------------- 呵呵 都是高手呀 数据库 应该比较稳妥吧 --------------------编程问答-------------------- 数据库比较稳妥 --------------------编程问答--------------------    将登录用户信息存放到session里,每个登录用户登录验证成功后判断session种是否存在该用户,存在则给出提示信息,不存在则使用系统 
--------------------编程问答-------------------- 将登录用户信息存放到session里,每个登录用户登录验证成功后判断session种是否存在该用户,存在则给出提示信息,不存在则使用系统   这个也不好用啊,加入用户量很大的话,时间会花费很长的,最好改变数据库的标志位,退出,或者session 销毁时,在修改过来 --------------------编程问答-------------------- 一般系统登录时候,需要验证用户名与密码,这里必然要用的数据库,如果说都匹配则可以进行登录。但是为了避免重复登录的情况,我们可以个用户数据库加一个标志位,用于判断该用户目前是否在线。
比方说:加一个Login_flag标志,用户没有登录时候设置为0,登录之后,设置为1,当用户退出了,才重新置为0.
那么系统在用户每次登录的时候,不仅仅需要判断用户名和密码是否匹配,同时还要查看登录标志位是否已经登录。 --------------------编程问答-------------------- 可以尝试多种解决方式并存:
(1)session
(2)数据库字段标识

一直想学习一下Token。 --------------------编程问答--------------------
引用 33 楼 daisycool 的回复:
引用 31 楼 yekai012 的回复:
引用 29 楼 daisycool 的回复:
引用 28 楼 yekai012 的回复:
如果你不想像QQ那样的硬踹方式,可以尝试以下思想,采用心跳方式,可以采用ajax方式来实现:
当用户登陆以后,此用户的页面,每两秒钟向服务器发送一个notify,表明自己还活着,后台的Servelet在map中记下“user-lastNotifyTime".……
顶!!! --------------------编程问答-------------------- 楼主可以谷歌一下单点登录 --------------------编程问答-------------------- application记录所有的登录用户,session记录单个用户登录状态,用易做图监听session状态, --------------------编程问答-------------------- 你的程序是BS的还是CS的 --------------------编程问答-------------------- 仔细一看,这贴好老啊 --------------------编程问答-------------------- 仔细一看,这贴好 --------------------编程问答--------------------      这个问题是其实是个很复杂的问题,我觉得72楼的那个靠谱,单点就是解决这个问题的!
  
 
    数据库里面设置一个字段要是非法退出,那个值要是一直是登录状态就永远登不上去了! --------------------编程问答--------------------
引用 2 楼 chong023 的回复:
将登录用户信息存放到session里,每个登录用户登录验证成功后判断session种是否存在该用户,存在则给出提示信息,不存在则使用系统

我写一个笨而土的思路,但一定可以用,如下:
登录之后跳转到一个Servlet(代码如下):

if(request.getSession().getAttriute("loginedUser")==null){
request.getSession().setAttribute("loginedUser",userBean);//如果session中不存在则说明没登录
request.getRequestDispatcher("index.jsp").forward(request,response);//跳转到登录成功页面
}else{//否则跟session中已有的比较一下
UserBean userBean=(UserBean)request.getSession().getAttriute("loginedUser");
if(request.getParameter("userName").equals(userBean.getUserName())&&
request.getParameter("userPassword").equals(userBean.getUserPassword)){//如果相同则为重复登录
response.getWriter().println("<scirpt>alert("您已登录,不能重复登录!");window.location.go(-1);</script>");//后退到上一个页面
}
}
--------------------编程问答-------------------- 我觉得:
      1、不赞成用数据库标志位的,试想一下,我登录以后,状态是在线,然后把系统重启,该用户就永远起不来了。
      2、也不赞成用Session,session就是当前会话,在别的地方上,就会创建新的Session,一样等上去。

我的大概思路是:

可以用Application+session,这个在容器里是全局的,user来一个我就put(username,User)一次,下次再来我就get,看有没有,有我就不让他登;session超时的时候,application执行一下remove

再写个易做图继承HttpSessionListener,重写Session销毁的方法,当session销毁的时候,可以取出user
然后根据该user 执行 appliction.remove(user);

欢迎楼下拍砖,尤其是金砖,银砖。 --------------------编程问答--------------------
引用 79 楼 w_huining 的回复:
我觉得:
  1、不赞成用数据库标志位的,试想一下,我登录以后,状态是在线,然后把系统重启,该用户就永远起不来了。
  2、也不赞成用Session,session就是当前会话,在别的地方上,就会创建新的Session,一样等上去。

我的大概思路是:

可以用Application+session,这个在容器里是全局的,user来一个我就put(username,User)一次,下次……


我不得不说,我实现的方式与你说的完全一致,哈哈 --------------------编程问答-------------------- 楼主要实现的就是一个单点登录的功能,简单点就像楼上各位仁兄们说的 用 Application 就可以

--------------------编程问答-------------------- 用cookie就能搞定,里面放用户sessionId 和 username 判断是否唯一! --------------------编程问答-------------------- 用会话就可以判断。 --------------------编程问答-------------------- 把用户信息放在session里吧 然后写个filter 来过滤session 检查session是否由用户就可以了啊 --------------------编程问答-------------------- 管理服务器的所有的session就可以了啊。 --------------------编程问答--------------------
引用 44 楼 yekai012 的回复:
引用 42 楼 wuhaiyangdh 的回复:
引用 39 楼 yekai012 的回复:
引用 37 楼 daisycool 的回复:
引用 34 楼 yekai012 的回复:


  Http是长连接还是短连接?session是存在服务器端的,而且是有一定的有效时间的,我在任务管理器中直接把IE干掉,你能马上检查出我的session无效了?我再开IE你不让我登陆?

  如果你的方法解决不了这些问题,不要说别人做的是无用功,解决问题是王道。至于你说的什么维护难度等,我觉得是什么不存的事,做成一个公共模块是众所周知的事,而且是可以提高复用性的。


楼上的太激动了。无意和你争辩什么,你觉得自己的方法好就去用它,我没有说你的方法是无用功,不过是从设计和系统维护的角度说说我的想法。单纯解决问题不是真正的王道,有效的解决问题才是目标。

-----------------------我也从设计角度上来说吧---------------------

    从设计角度上来说,楼主的需求本身就是不合理的,因为Http是短连接且无状态的,有人提到了session,session的实时性要差,更有人提到了数据库,这个我是彻底反对了,原因就是你无法保证数据总是同步的。
    但有时候客户是不讲理的,和他们讲设计是没有用的,出于特殊情况就要特殊处理,这种情况下已经不能再列扣设计,当然如果按设计模式做会更好。但是前提是什么?
    -----软件的第一要素是什么?首先是能解问题,解决不了问题还要他做什么。所以,当你的做法无法通过所有的测试case的情况下,说明你的方法解决不了问题,问题都解决不了的情况下,你和别人说设计,显然是不切实际的。
   
你的方法确实有楼主说的弊端的,你很偏执,既然讨论,你给出方案,我想楼主还是高兴的,大家都心平气和思考就行了


你们两个不用吵了。
session失效时会触发HttpSessionEvent,绑定一个HttpSessionListener就可以解决了。

javax.servlet.http 
Inte易做图ce HttpSessionListener
 All Superinte易做图ces: EventListener 
--------------------------------------------------------------------------------
public inte易做图ce HttpSessionListenerextends EventListener
 Implementations of this inte易做图ce are notified of changes to the list of active sessions in a web application. To receive notification events, the implementation class must be configured in the deployment descriptor for the web application.
 

Since:v 2.3 See Also:HttpSessionEvent 
--------------------------------------------------------------------------------


Method Summary
 

 void sessionCreated(HttpSessionEvent se)
           Notification that a session was created.
 

 void sessionDestroyed(HttpSessionEvent se)
           Notification that a session is about to be invalidated.
--------------------编程问答-------------------- 用数据库的朋友,请考虑web服务器重启的情况。 --------------------编程问答--------------------
引用 9 楼 daisycool 的回复:
如果你想只允许第一个用户登录的话,可以存点信息在数据库里,比如说用户名,用户登陆时查找这个用户名是否已经登陆,如果是则不允许登录。

如果你想让后来的登录者把前一个登录者踢下线,则需要存储session ID,用户名可以存在数据库,也可以使用保存在session里的那个。当新用户登陆的时候,搜索这个用户名是否已登录,如果是,则找到相应session ID,把它invalidate,然后再把新的……


这个很不错啊 --------------------编程问答--------------------
引用 9 楼 daisycool 的回复:
如果你想只允许第一个用户登录的话,可以存点信息在数据库里,比如说用户名,用户登陆时查找这个用户名是否已经登陆,如果是则不允许登录。

如果你想让后来的登录者把前一个登录者踢下线,则需要存储session ID,用户名可以存在数据库,也可以使用保存在session里的那个。当新用户登陆的时候,搜索这个用户名是否已登录,如果是,则找到相应session ID,把它invalidate,然后再把新……

正解! --------------------编程问答-------------------- cookie 怎么用啊 --------------------编程问答--------------------
引用 90 楼  的回复:
cookie 怎么用啊


找度娘去
补充:Java ,  Web 开发
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,