用户没有正常退出系统,导致无法登录系统的问题

kingsuperman 2011-01-24 02:58:50
在用户登录网站成功后,我会把用户登录IP及其相关信息写入数据表,目的就是防止用户2次登录,相当于是锁定吧。

正常情况下,用户点击页面上的“退出系统”按钮,我就会清空登录时记录的数据表信息,也就是解锁了,但是如果用户没有点

击“退出系统”,而是直接关闭浏览器或者在进程里面杀掉IE进程,那就没有触发解锁那个动作,也就是数据表没有清空,这样就导

致了客户无法再次登录系统。

问题描述如上,各位大侠们,有啥好的想法,都说说,感谢大家了,小弟分也不多,说点好听的图个吉祥,也快春节了,祝所有看帖者,顶帖者春节快乐,发财一辈子!!
...全文
1026 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
用 SessionListener 吧,11 楼的代码,在 sessionDestroyed 方法中注销用户。另外在 web.xml 把这个 listener 配置一下就可以了。
whut_lcy 2011-01-24
  • 打赏
  • 举报
回复
这东西放在服务器端管理最安全。而且HTTPSession的生命周期管理,web容器已经实现了。在Session的各种生命周期状态监听和事件接口中跟踪用户状态


Inhibitory 2011-01-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 shine333 的回复:]

引用 5 楼 moodoasis 的回复:
2楼的朋友,您的方法,挺不错的,但我还得加上点东西,
因为有用户同ID同时登录的情况。
所以不如对SESSION做一个遍历,不过对于企业外部应用,就比较难了,因为用户太多了。


马甲啊?
[/Quote]
我@#¥%#¥&…×&(×)
JinQizun 2011-01-24
  • 打赏
  • 举报
回复
有点像操作系统中的一个名词——临界区。
UPC_思念 2011-01-24
  • 打赏
  • 举报
回复
应该是用session监听器来解决此问题
lioutou 2011-01-24
  • 打赏
  • 举报
回复
楼上正解
jakjava 2011-01-24
  • 打赏
  • 举报
回复
我做这个需求的时存了个sessionId,查的时候只用这个和userId 表中 sessionId 存在客户cookie中,及服务器表中
登陆时查询
sessionId在,userId在 正在登陆用户重复登陆
sessionId不在,userId不在 用户正常退出现在在进行登陆
sessionId不在,userId在 帐号重复登陆
sessionId在,userId不在 登陆未正常退出在做重复登陆
正常退出时删除该登陆记录
BUG,当客户端清掉节Cookie会有问题,解决就是每天定时清除这张表记录
磊磊崔 2011-01-24
  • 打赏
  • 举报
回复
session监听你知道吧?可以监听session的销毁事件,从而进行相应的操作,简单的例子:

import javax.servlet.*;
import javax.servlet.http.*;

public class SessionCount implements HttpSessionListener
{
private static int count=0;

public void sessionCreated(HttpSessionEvent se)
{
System.out.println(“session创建:”+new java.util.Date());
}

public void sessionDestroyed(HttpSessionEvent se)
{
System.out.println(“session销毁:”+new java.util.Date());
}
}

然后简单的配置一下这个监听就可以了。
Inhibitory 2011-01-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 moodoasis 的回复:]

2楼的朋友,您的方法,挺不错的,但我还得加上点东西,
因为有用户同ID同时登录的情况。
所以不如对SESSION做一个遍历,不过对于企业外部应用,就比较难了,因为用户太多了。
[/Quote]
*^_^*,我弄的这个功能,主要是现在我需要统计用户在线时间,所以这样设计。只是希望能给楼主提供一种思路,*^_^*
lujun0108 2011-01-24
  • 打赏
  • 举报
回复
在Session释放事件里面把数据库里面的这个锁记录删除掉 然后设置Session时效短一点,
然后,你比较ip地址 同一个机器允许重复登录,不同机器不允许登录
shine333 2011-01-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 moodoasis 的回复:]
2楼的朋友,您的方法,挺不错的,但我还得加上点东西,
因为有用户同ID同时登录的情况。
所以不如对SESSION做一个遍历,不过对于企业外部应用,就比较难了,因为用户太多了。
[/Quote]

马甲啊?
Asdcer 2011-01-24
  • 打赏
  • 举报
回复
只能定时访问服务器或每次请求更新服务器
moodoasis 2011-01-24
  • 打赏
  • 举报
回复
2楼的朋友,您的方法,挺不错的,但我还得加上点东西,
因为有用户同ID同时登录的情况。
所以不如对SESSION做一个遍历,不过对于企业外部应用,就比较难了,因为用户太多了。
shine333 2011-01-24
  • 打赏
  • 举报
回复
如果碰到这种情况,你可以在后登录者的页面上写上:
检测到您未正常退出,是否强制退出上一个会话?

如果选择“是”,就把数据库上次的会话信息正常退出掉,并让新的人进来。


但是,如果这种操作针对的是普通用户的话,就没必要这样设计。b/s或者http基本是无状态的,所以没必要搞个这样的锁定,强制要求每个用户必须手工退出。
kingsuperman 2011-01-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 inhibitory 的回复:]
正好我昨天在想这个算法,我的方法为:
login_trace: login_time(登录时间), online_time(当前在线时间)
登录信息里加上登录时间和用户当前在线时间,用户每隔一段时间给服务器发送一条消息(如10秒),表明在线,然后修改用户当前在线时间。

用户再次登录时,如果登录记录存在,取得当前在线时间加上间隔时间,如果大于现在的时间(再次登录的时间),表明已经登录过了,……
[/Quote]

感谢你的回复
首先得肯定你这个方式,但是很遗憾,我用不了这个方法,因为底层都是封装好的,比如:登录,退出等等操作都是通过接口的方式,我只能是调用清空记录的接口,就像正常情况下,点击按钮调用接口方法清空记录,我想的是每个用户都有一个独立的Session,能不能在Session销毁的时候来调用清空记录的接口,但是不知道怎么弄,纠结
Inhibitory 2011-01-24
  • 打赏
  • 举报
回复
正好我昨天在想这个算法,我的方法为:
login_trace: login_time(登录时间), online_time(当前在线时间)
登录信息里加上登录时间和用户当前在线时间,用户每隔一段时间给服务器发送一条消息(如10秒),表明在线,然后修改用户当前在线时间。

用户再次登录时,如果登录记录存在,取得当前在线时间加上间隔时间,如果大于现在的时间(再次登录的时间),表明已经登录过了,如果小于,则表明上次用户是异常退出,可以进行登录。
jklzou3 2011-01-24
  • 打赏
  • 举报
回复
路过!我觉得好像是哪个地方没有销毁,或关闭!

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧