日期:2014-05-18  浏览次数:20694 次

jsp怎么实现同一个帐户不能同时登陆系统
jsp怎么实现同一个帐户不能同时登陆系统   ,xiexiele

------解决方案--------------------
SessionBindingListener才素王道。
------解决方案--------------------
利用SessionBindingListener也是可以解决的
------解决方案--------------------
小问题, 大学问!

这个跟 Session 没有关系吧, 两个人在不同的地方登陆同一ID号, 应该是不同的Session吧~~

这个应该是放在application里吧. 用户登陆是全局事件~~
==============================================
不同意你的说法。要实现“一个帐户不能同时登录”的目标,不外乎两种选择:1.拒绝登录请求,提示后登录者此帐号已登录;2.接受登录,用后登录者的Session取代已登录者,即所谓的踢人。大多数情况下要用到第2种解决方案,这时候岂能跟Session没有关系?
------解决方案--------------------
小问题, 大学问!

这个跟 Session 没有关系吧, 两个人在不同的地方登陆同一ID号, 应该是不同的Session吧~~

这个应该是放在application里吧. 用户登陆是全局事件~~
==============================================
不同意你的说法。要实现“一个帐户不能同时登录”的目标,不外乎两种选择:1.拒绝登录请求,提示后登录者此帐号已登录;2.接受登录,用后登录者的Session取代已登录者,即所谓的踢人。大多数情况下要用到第2种解决方案,这时候岂能跟Session没有关系?

==============================================

我认为, 每个 Session 是在用户连接网站后分配的, 此时尚未登陆, 如果两个人用同一个ID登陆且没有检测用户名重复的话, 那么将会用同一ID登陆. 而我们要检测用户名重复的话, 就要遍历所有用户名, 检查重复, 通常用户名与Session绑定, 所以我们可以遍历Session进行判断.

不管我们采取哪一种方法, 都不是一个Session所能解决的, 是所有Session一块作用的结果, 所有我说这其实是和application相关的一个问题.

1. 我们的用户名不一定要放在Session(只是可能), 也可以放在application中, 在application中建立已登陆用户ID列表.

2. 个人认为, apllication 一定也维护一个Session列表, 遍历所有的Session 不也是application 的一个方法调用吗?

所有说这个问题是 application级 的一个问题.

因此 :
不管用什么方法, 都可以归结为一个方法. 那就是要在服务器上维护一个用户列表. 而这个列表一定要放在application上, 不能放在一个单独的 page, request, session 之中.

而我们要实现这个目标, 就要在检查用户名和密码的那一次请求中进行验证.
如果用户列表是我们维护的话, 我们可以直接进行验证.
如果用户与Session绑定的话, 也可以遍历Session列表.

HttpSessionAttributeListener 则是采用另外一种方法.
因为我们把用户与Session绑定了, 因此就要在Session属性里填加一些值, 而验证就在listener里进行. 它会临听所有的Session属性改变.

我们的想法是, 用户名没重复, 则Session里加属性, 而这个方法是先加属性, 如果没重复, 则成功, 好像换了种思维思考问题, 不过原理还是一样的.

说来说去, 还是前面一位仁兄的话:

yes 最简单的就是放在Application里 SessionBindingListener 或 HttpSessionAttributeListener,HttpSessionListener 都是可以的


小问题, 大学问啊!!!~~~



------解决方案--------------------
放在Application里 SessionBindingListener 或HttpSessionAttributeListener,HttpSessionListener
------解决方案--------------------
引用:
pczhouji(挪威的森林) ( ) 信誉:100 Blog 2007-1-25 21:46:19 得分: 0

SessionBindingListener才素王道。


这点我同意. 模块分离而又容易理解与使用.
------解决方案--------------------
创建一张在线用户表online_user,其中有user_id, latest_active_time

在用户登录时,先进行安全认证。
如果成功,再查online_user表中有没有此用户的id,

如果没有
则可以正常登录,
并向online_user表中插入一条数据(user_id,latest_active_time)
如果有
则察看latest_active_time的值与当前时间的 "时间差 "是否大于一个指定的时间段(比如可以和session timeout的时间比较)
如果大于的话,
则表明该用户已经超过一定时间没有活动,我们视为离线状态,否则为在线状态。
如果小于
则证明用户在线,拒绝登陆,提示用户过段时间再登录。(虽然这样做不是最佳的解决方案)

还有当用户从logout离开系统的话,记得删除online_user中属于该用户的数据

以上解决方案可以解决用户关浏览器退出时的情况,但是有一点,如果用户直接关浏览器退出,在一段时间内无法登录

不知道有没有更好地解决方案