42 个解决方案
#1
数据表的设计中添加一个标志字段,标记是否登陆
#2
一楼的办法是不妥当的,万一客户端登陆后浏览器突然崩溃的话,那个用户永远也登陆不了了,我的解决办法是 采用HttpSessionBindingListener,还可以统计在线人数
#3
这个问题讨论过很多
没有特别好的解决方法,因为b/s的东西特点就是登陆、使用方便
没有特别好的解决方法,因为b/s的东西特点就是登陆、使用方便
#4
登入全局变量缓冲
和HttpSessionBindingListener的思想差不多
和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");
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
如果两者都不一样,就让他等一段时间吧!
本地软件模式, 这样就比较简单了,可以一直通讯(类似QQ)
一般网页里面要这样的话 不是个简单的事情 考虑的事情太多
最好记录网卡MAC参数和IP同时进行 以免一些ADSL用户!
如果两次登陆ip一样 而网卡不一样 可能是网吧换机
网卡一样,ip不一样,可能是adsl
如果两者都不一样,就让他等一段时间吧!
#26
关注中
#27
就这么一个功能就这么麻烦。哎。。。什么破编程啊!!
#28
HttpSessionBindingListener 解决不了集群情况下的重复登陆。
将登陆者的帐号和sessionid绑定,放入分布式缓存中。当一个账户登陆时检查是否已经登陆,如已登陆则将先登陆的帐号打上过期标志,用户每次访问都检查到缓存中检查是否被打上过期标志。过期的帐户信息让分布式缓存自动清除,不用担心OutOfMemory的危险。
将登陆者的帐号和sessionid绑定,放入分布式缓存中。当一个账户登陆时检查是否已经登陆,如已登陆则将先登陆的帐号打上过期标志,用户每次访问都检查到缓存中检查是否被打上过期标志。过期的帐户信息让分布式缓存自动清除,不用担心OutOfMemory的危险。
#29
e...不懂!
#30
mark
#31
顶一个 关注一下
#32
一般情况下采用设置标志位就可以 但是考虑到安全稳定的话就不行了
#33
在点击登录按钮时,用FILTER过滤一下,在WEB.XML配置中的ACTION映射中/*.do,当后缀为.do的所有操作进行过滤,自己写一个类实现FILTER
#34
数据库中多两个字段
在线状态标志(用来记录是否登录)
最后活动时间(用来记录用户最后活动时间)
比如online=1说明此用户已经在线,那么判断用户活动时间与系统日期间隔是否大于3分钟,如果小于那么认为用户仍然处于活动状态中,禁止登录。否则相反。
用户每次活动更新最后活动时间为系统当前时间。
至于间隔多少分钟,自己说的算。
在线状态标志(用来记录是否登录)
最后活动时间(用来记录用户最后活动时间)
比如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的东西特点就是登陆、使用方便
没有特别好的解决方法,因为b/s的东西特点就是登陆、使用方便
#4
登入全局变量缓冲
和HttpSessionBindingListener的思想差不多
和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");
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
如果两者都不一样,就让他等一段时间吧!
本地软件模式, 这样就比较简单了,可以一直通讯(类似QQ)
一般网页里面要这样的话 不是个简单的事情 考虑的事情太多
最好记录网卡MAC参数和IP同时进行 以免一些ADSL用户!
如果两次登陆ip一样 而网卡不一样 可能是网吧换机
网卡一样,ip不一样,可能是adsl
如果两者都不一样,就让他等一段时间吧!
#26
关注中
#27
就这么一个功能就这么麻烦。哎。。。什么破编程啊!!
#28
HttpSessionBindingListener 解决不了集群情况下的重复登陆。
将登陆者的帐号和sessionid绑定,放入分布式缓存中。当一个账户登陆时检查是否已经登陆,如已登陆则将先登陆的帐号打上过期标志,用户每次访问都检查到缓存中检查是否被打上过期标志。过期的帐户信息让分布式缓存自动清除,不用担心OutOfMemory的危险。
将登陆者的帐号和sessionid绑定,放入分布式缓存中。当一个账户登陆时检查是否已经登陆,如已登陆则将先登陆的帐号打上过期标志,用户每次访问都检查到缓存中检查是否被打上过期标志。过期的帐户信息让分布式缓存自动清除,不用担心OutOfMemory的危险。
#29
e...不懂!
#30
mark
#31
顶一个 关注一下
#32
一般情况下采用设置标志位就可以 但是考虑到安全稳定的话就不行了
#33
在点击登录按钮时,用FILTER过滤一下,在WEB.XML配置中的ACTION映射中/*.do,当后缀为.do的所有操作进行过滤,自己写一个类实现FILTER
#34
数据库中多两个字段
在线状态标志(用来记录是否登录)
最后活动时间(用来记录用户最后活动时间)
比如online=1说明此用户已经在线,那么判断用户活动时间与系统日期间隔是否大于3分钟,如果小于那么认为用户仍然处于活动状态中,禁止登录。否则相反。
用户每次活动更新最后活动时间为系统当前时间。
至于间隔多少分钟,自己说的算。
在线状态标志(用来记录是否登录)
最后活动时间(用来记录用户最后活动时间)
比如online=1说明此用户已经在线,那么判断用户活动时间与系统日期间隔是否大于3分钟,如果小于那么认为用户仍然处于活动状态中,禁止登录。否则相反。
用户每次活动更新最后活动时间为系统当前时间。
至于间隔多少分钟,自己说的算。
#35
HttpSessionBindingListener这个我不懂
但是其他的方法,基本上和数据库添加的差别不大。
没有明显的优点。
但是其他的方法,基本上和数据库添加的差别不大。
没有明显的优点。
#36
HttpSessionBindingListener
#37
一样的,就是在数据表里做个标志,但必须得要实现对session的监听,当session超时的时候就更改数据表中的标志!如果不正常退出,就得再等上seesion超时的时间才可以再次登陆系统
应该是这样的
应该是这样的
#38
将在线用户ID存到Vector变量中,登陆时检查ID是否存在
#39
关注中
#40
数据库中添加字段
#41
检索一下所有的session, 不过不同的服务器取所有的session方法不一样
#42
up