怎样禁止用户重复登陆?

时间:2022-12-01 14:47:53
比如一个用户在A机上登陆后,其它电脑就不能用这个帐号登陆了?

42 个解决方案

#1


数据表的设计中添加一个标志字段,标记是否登陆

#2


一楼的办法是不妥当的,万一客户端登陆后浏览器突然崩溃的话,那个用户永远也登陆不了了,我的解决办法是 采用HttpSessionBindingListener,还可以统计在线人数

#3


这个问题讨论过很多

没有特别好的解决方法,因为b/s的东西特点就是登陆、使用方便

#4


登入全局变量缓冲
和HttpSessionBindingListener的思想差不多

#5


DING

#6


ding

#7


应该使用session吧

#8


一样的,就是在数据表里做个标志,但必须得要实现对session的监听,当session超时的时候就更改数据表中的标志!如果不正常退出,就得再等上seesion超时的时间才可以再次登陆系统

#9


up,关注中

#10


关注

#11


也许有更好的答案

#12


用1楼的方案,再加上用户解锁的功能,解决不正常退出的问题

#13


这种思路不符合方便实用的B/S的初衷

#14


使用标志位 + SESSION生存期.

#15


DING,期待更好的方法!~

#16


不会存在你理想中的方法

#17


点击按钮时将该按钮不可选

#18


我最近看书时见过一种解决办法,是采用同步令牌的办法。具体代码怎么实现,我不太清楚。

#19


用户表中加入两个字段,一个记录状态标志,一个记录登陆站点。
正常退出,清理这两个字段的值。
非正常退出,则这个站点只能有此用户进行登录(也只能在此站点登录),进行处理。
湖南创智的医保系统就是这样处理的。

#20


#21


mark

#22


采用HttpSessionBindingListener  我现在的是重复登陆踢掉以前的那个登陆 稍微改下就可以禁止重复登陆了~~~~~~~

#23


ServletContext context = request.getSession().getServletContext();
   HashMap userlist = (HashMap) context.getAttribute("userlist");
   if (userlist != null) {//如果userlist不为空则判断userlist是否有user这个用户
    Set set = userlist.entrySet();
    Iterator it = set.iterator();
    String removeid = null;
    while (it.hasNext()) {//迭代用户列表
     Map.Entry entry = (Map.Entry) it.next();
     HttpSession sess = (HttpSession) entry.getValue();
     User userexit = (User) sess.getAttribute("user");
     String s = userexit.getUserID();
     if (userId.equals(s))
      removeid = sess.getId();//得到要删除的sessionID
    }
    userlist.remove(removeid);//如果用户已经存在则删除前面的用户
   }
   session.setAttribute("user", user);//添加用户
   session.setAttribute("BindingNotify", new MySessionListener());//绑定监听器
   return mapping.findForward("success");

#24


学习,一直想问这个来着。

#25


可是适用
本地软件模式,     这样就比较简单了,可以一直通讯(类似QQ)
一般网页里面要这样的话 不是个简单的事情 考虑的事情太多
最好记录网卡MAC参数和IP同时进行 以免一些ADSL用户!
如果两次登陆ip一样 而网卡不一样 可能是网吧换机
网卡一样,ip不一样,可能是adsl
如果两者都不一样,就让他等一段时间吧!

#26


关注中

#27


就这么一个功能就这么麻烦。哎。。。什么破编程啊!!

#28


HttpSessionBindingListener 解决不了集群情况下的重复登陆。

将登陆者的帐号和sessionid绑定,放入分布式缓存中。当一个账户登陆时检查是否已经登陆,如已登陆则将先登陆的帐号打上过期标志,用户每次访问都检查到缓存中检查是否被打上过期标志。过期的帐户信息让分布式缓存自动清除,不用担心OutOfMemory的危险。

#29


e...不懂!

#30


mark

#31


顶一个 关注一下

#32


一般情况下采用设置标志位就可以 但是考虑到安全稳定的话就不行了

#33


在点击登录按钮时,用FILTER过滤一下,在WEB.XML配置中的ACTION映射中/*.do,当后缀为.do的所有操作进行过滤,自己写一个类实现FILTER

#34


数据库中多两个字段

在线状态标志(用来记录是否登录)
最后活动时间(用来记录用户最后活动时间)

比如online=1说明此用户已经在线,那么判断用户活动时间与系统日期间隔是否大于3分钟,如果小于那么认为用户仍然处于活动状态中,禁止登录。否则相反。

用户每次活动更新最后活动时间为系统当前时间。

至于间隔多少分钟,自己说的算。

#35


HttpSessionBindingListener这个我不懂
但是其他的方法,基本上和数据库添加的差别不大。
没有明显的优点。

#36


HttpSessionBindingListener

#37


一样的,就是在数据表里做个标志,但必须得要实现对session的监听,当session超时的时候就更改数据表中的标志!如果不正常退出,就得再等上seesion超时的时间才可以再次登陆系统

应该是这样的

#38


将在线用户ID存到Vector变量中,登陆时检查ID是否存在

#39


关注中

#40


数据库中添加字段

#41


检索一下所有的session, 不过不同的服务器取所有的session方法不一样

#42


up

#1


数据表的设计中添加一个标志字段,标记是否登陆

#2


一楼的办法是不妥当的,万一客户端登陆后浏览器突然崩溃的话,那个用户永远也登陆不了了,我的解决办法是 采用HttpSessionBindingListener,还可以统计在线人数

#3


这个问题讨论过很多

没有特别好的解决方法,因为b/s的东西特点就是登陆、使用方便

#4


登入全局变量缓冲
和HttpSessionBindingListener的思想差不多

#5


DING

#6


ding

#7


应该使用session吧

#8


一样的,就是在数据表里做个标志,但必须得要实现对session的监听,当session超时的时候就更改数据表中的标志!如果不正常退出,就得再等上seesion超时的时间才可以再次登陆系统

#9


up,关注中

#10


关注

#11


也许有更好的答案

#12


用1楼的方案,再加上用户解锁的功能,解决不正常退出的问题

#13


这种思路不符合方便实用的B/S的初衷

#14


使用标志位 + SESSION生存期.

#15


DING,期待更好的方法!~

#16


不会存在你理想中的方法

#17


点击按钮时将该按钮不可选

#18


我最近看书时见过一种解决办法,是采用同步令牌的办法。具体代码怎么实现,我不太清楚。

#19


用户表中加入两个字段,一个记录状态标志,一个记录登陆站点。
正常退出,清理这两个字段的值。
非正常退出,则这个站点只能有此用户进行登录(也只能在此站点登录),进行处理。
湖南创智的医保系统就是这样处理的。

#20


#21


mark

#22


采用HttpSessionBindingListener  我现在的是重复登陆踢掉以前的那个登陆 稍微改下就可以禁止重复登陆了~~~~~~~

#23


ServletContext context = request.getSession().getServletContext();
   HashMap userlist = (HashMap) context.getAttribute("userlist");
   if (userlist != null) {//如果userlist不为空则判断userlist是否有user这个用户
    Set set = userlist.entrySet();
    Iterator it = set.iterator();
    String removeid = null;
    while (it.hasNext()) {//迭代用户列表
     Map.Entry entry = (Map.Entry) it.next();
     HttpSession sess = (HttpSession) entry.getValue();
     User userexit = (User) sess.getAttribute("user");
     String s = userexit.getUserID();
     if (userId.equals(s))
      removeid = sess.getId();//得到要删除的sessionID
    }
    userlist.remove(removeid);//如果用户已经存在则删除前面的用户
   }
   session.setAttribute("user", user);//添加用户
   session.setAttribute("BindingNotify", new MySessionListener());//绑定监听器
   return mapping.findForward("success");

#24


学习,一直想问这个来着。

#25


可是适用
本地软件模式,     这样就比较简单了,可以一直通讯(类似QQ)
一般网页里面要这样的话 不是个简单的事情 考虑的事情太多
最好记录网卡MAC参数和IP同时进行 以免一些ADSL用户!
如果两次登陆ip一样 而网卡不一样 可能是网吧换机
网卡一样,ip不一样,可能是adsl
如果两者都不一样,就让他等一段时间吧!

#26


关注中

#27


就这么一个功能就这么麻烦。哎。。。什么破编程啊!!

#28


HttpSessionBindingListener 解决不了集群情况下的重复登陆。

将登陆者的帐号和sessionid绑定,放入分布式缓存中。当一个账户登陆时检查是否已经登陆,如已登陆则将先登陆的帐号打上过期标志,用户每次访问都检查到缓存中检查是否被打上过期标志。过期的帐户信息让分布式缓存自动清除,不用担心OutOfMemory的危险。

#29


e...不懂!

#30


mark

#31


顶一个 关注一下

#32


一般情况下采用设置标志位就可以 但是考虑到安全稳定的话就不行了

#33


在点击登录按钮时,用FILTER过滤一下,在WEB.XML配置中的ACTION映射中/*.do,当后缀为.do的所有操作进行过滤,自己写一个类实现FILTER

#34


数据库中多两个字段

在线状态标志(用来记录是否登录)
最后活动时间(用来记录用户最后活动时间)

比如online=1说明此用户已经在线,那么判断用户活动时间与系统日期间隔是否大于3分钟,如果小于那么认为用户仍然处于活动状态中,禁止登录。否则相反。

用户每次活动更新最后活动时间为系统当前时间。

至于间隔多少分钟,自己说的算。

#35


HttpSessionBindingListener这个我不懂
但是其他的方法,基本上和数据库添加的差别不大。
没有明显的优点。

#36


HttpSessionBindingListener

#37


一样的,就是在数据表里做个标志,但必须得要实现对session的监听,当session超时的时候就更改数据表中的标志!如果不正常退出,就得再等上seesion超时的时间才可以再次登陆系统

应该是这样的

#38


将在线用户ID存到Vector变量中,登陆时检查ID是否存在

#39


关注中

#40


数据库中添加字段

#41


检索一下所有的session, 不过不同的服务器取所有的session方法不一样

#42


up