原来打算在用户登录的时候在数据库里写一个标志位,但如果一个人正常登陆,那么在数据库中记录下他的登录。在他正常退出的时候在数据库中将他的登录记录删除。如果另一个人用相同的登录名称和密码登录的时候,检索数据库,这时数据库中记录显示该用户正在线上,所以提示他不能登录。但问题是:如果一个人正常登录后,突然死机了。那他不经过正常退出,这样的话,他在数据库中的记录永远是在线。下次他在登录的时候还是不能进来。请问这个问题怎么解决?
17 个解决方案
#1
作一格隐藏帧, 在里面每隔一短时间,比如5秒钟,刷新一下。。。相当于重新执行一下。。看sessionID 与 userID 相比配的时候存在,不存在就把userID删除。
#2
建议用Hashtable
#3
回一楼的:如果不刷新的话,那数据库中的登录记录永远不变了啊。这样,如果死机后,在登录就进不去了。
回2楼的:什么是Hashtable啊??汗。。。。。。
回2楼的:什么是Hashtable啊??汗。。。。。。
#4
在数据库中加一个字段记录他最后登陆和最后离开时间
如果正常的话,最后离开时间是在最后登陆时间之后
如果不正常退出的话,那么最后离开时间在最后登陆时间之前。
然后确定一个时间差,如20分钟,就像Session一样,并根据这个用户名的最后登陆时间和最后离开时间来决定是否已经登陆
如果正常的话,最后离开时间是在最后登陆时间之后
如果不正常退出的话,那么最后离开时间在最后登陆时间之前。
然后确定一个时间差,如20分钟,就像Session一样,并根据这个用户名的最后登陆时间和最后离开时间来决定是否已经登陆
#5
用个计数器,再用条件判断!!
#6
关注。
再数据库中做标记
再数据库中做标记
#7
在服务器端判断用户当前活动状态
如果用户死机(非正常退出)
则服务器端当发现用户在指定活动期限内未发生动作(超时),认为用户退出(或死机)
自动注销该用户
如果用户死机(非正常退出)
则服务器端当发现用户在指定活动期限内未发生动作(超时),认为用户退出(或死机)
自动注销该用户
#8
服务器端当发现用户在指定活动期限内未发生动作(超时),认为用户退出(或死机)
自动注销该用户
这个挺好的
试试吧
自动注销该用户
这个挺好的
试试吧
#9
不能用Application对象吗?
#10
做一个bean,状态声明为session
里面有个static的vector
用户登陆的时候就往里面加一个。session失效的时候就减一个
如果登陆时候,发现重复的session就不让他登陆。
里面有个static的vector
用户登陆的时候就往里面加一个。session失效的时候就减一个
如果登陆时候,发现重复的session就不让他登陆。
#11
/**
* 当用户创建一个会话时,将用户该对象实力放入到再现用户列表中
* @param event
*/
public void valueBound(HttpSessionBindingEvent event) {
boolean dup = false;
for (int i = 0; i < UserSession.userList.size(); i++) {
UserSession u = (UserSession) UserSession.userList.get(i);
if (u != null
&& u.getUserName() != null
&& u.getUserId().equals(
this.getUserId())) { // forbid add a duplicate user
dup = true;
}
}
if (!dup) {
UserSession.userList.add(this);
}
System.out.println(this.userId + " added into userlist");
}
/**
* 当用户会话失效时,在再现用户表中将该对象实力删除
* @param event
*/
public void valueUnbound(HttpSessionBindingEvent event) {
UserSession.userList.remove(this);
System.out.println(this.userId + " remove from userlist");
}
* 当用户创建一个会话时,将用户该对象实力放入到再现用户列表中
* @param event
*/
public void valueBound(HttpSessionBindingEvent event) {
boolean dup = false;
for (int i = 0; i < UserSession.userList.size(); i++) {
UserSession u = (UserSession) UserSession.userList.get(i);
if (u != null
&& u.getUserName() != null
&& u.getUserId().equals(
this.getUserId())) { // forbid add a duplicate user
dup = true;
}
}
if (!dup) {
UserSession.userList.add(this);
}
System.out.println(this.userId + " added into userlist");
}
/**
* 当用户会话失效时,在再现用户表中将该对象实力删除
* @param event
*/
public void valueUnbound(HttpSessionBindingEvent event) {
UserSession.userList.remove(this);
System.out.println(this.userId + " remove from userlist");
}
#12
建议用hashmap记录用户session对象。用singleton或application对象来存放hashmap。
每当用户试图登陆的时候就开始在hashmap里查找是否已经存在该session
如果存在则销毁该session。重新建立该用户的session。把该session对象放入hashmap中。
如果不存在,建立用户的session,把该session放入hashmap中。
如果超时了,从hashmap删除该用户session对象。
这样做的后果是:如果有相同用户同时登陆,则强行销毁先登陆用户的session,用后登陆的用户登陆。(类型qq和msn的用户同时登陆机制)
每当用户试图登陆的时候就开始在hashmap里查找是否已经存在该session
如果存在则销毁该session。重新建立该用户的session。把该session对象放入hashmap中。
如果不存在,建立用户的session,把该session放入hashmap中。
如果超时了,从hashmap删除该用户session对象。
这样做的后果是:如果有相同用户同时登陆,则强行销毁先登陆用户的session,用后登陆的用户登陆。(类型qq和msn的用户同时登陆机制)
#13
为什么不用在数据库里设个字段?
表明用户的状态,在线就设为1,其余为0,在用户退出的时候把它置为0
登陆的时候置为1
这样关键就是防止用户直接点击关闭按钮,这个可以在页面的body里 onunload=“javascript:window.open("logout.jsp","","fullscreen=0,toolbar=1,scrollbars=1,menubar=1,location=0,width=10,height=10,top=0,left=0")”
在logout.jsp页面里注销session和更换数据库该用户的状态
表明用户的状态,在线就设为1,其余为0,在用户退出的时候把它置为0
登陆的时候置为1
这样关键就是防止用户直接点击关闭按钮,这个可以在页面的body里 onunload=“javascript:window.open("logout.jsp","","fullscreen=0,toolbar=1,scrollbars=1,menubar=1,location=0,width=10,height=10,top=0,left=0")”
在logout.jsp页面里注销session和更换数据库该用户的状态
#14
然后用widow.close();关闭logout.jsp
你觉得这样做怎么样?
你觉得这样做怎么样?
#15
用一个表记录上线情况1(上线)/0(下线)
#16
有这一建议
在用户表后加一字段,f_refresh datetime,f_sessionid
然后,在使用的页面上加一个iframe(子帧),如果是框架型的就在一个不变的框架上加,如果不是的话就在每个页面上加个包含页面
这个子帧每隔五秒刷新,更新f_refresh字段为当前日期、时间值
然后在登录页面加一个判断
如果系统当前时间与f_refresh 差别小于十秒或者f_sessionid不同,那么就不可以登陆
#17
tong yi: 用一个表记录上线情况1(上线)/0(下线)
#1
作一格隐藏帧, 在里面每隔一短时间,比如5秒钟,刷新一下。。。相当于重新执行一下。。看sessionID 与 userID 相比配的时候存在,不存在就把userID删除。
#2
建议用Hashtable
#3
回一楼的:如果不刷新的话,那数据库中的登录记录永远不变了啊。这样,如果死机后,在登录就进不去了。
回2楼的:什么是Hashtable啊??汗。。。。。。
回2楼的:什么是Hashtable啊??汗。。。。。。
#4
在数据库中加一个字段记录他最后登陆和最后离开时间
如果正常的话,最后离开时间是在最后登陆时间之后
如果不正常退出的话,那么最后离开时间在最后登陆时间之前。
然后确定一个时间差,如20分钟,就像Session一样,并根据这个用户名的最后登陆时间和最后离开时间来决定是否已经登陆
如果正常的话,最后离开时间是在最后登陆时间之后
如果不正常退出的话,那么最后离开时间在最后登陆时间之前。
然后确定一个时间差,如20分钟,就像Session一样,并根据这个用户名的最后登陆时间和最后离开时间来决定是否已经登陆
#5
用个计数器,再用条件判断!!
#6
关注。
再数据库中做标记
再数据库中做标记
#7
在服务器端判断用户当前活动状态
如果用户死机(非正常退出)
则服务器端当发现用户在指定活动期限内未发生动作(超时),认为用户退出(或死机)
自动注销该用户
如果用户死机(非正常退出)
则服务器端当发现用户在指定活动期限内未发生动作(超时),认为用户退出(或死机)
自动注销该用户
#8
服务器端当发现用户在指定活动期限内未发生动作(超时),认为用户退出(或死机)
自动注销该用户
这个挺好的
试试吧
自动注销该用户
这个挺好的
试试吧
#9
不能用Application对象吗?
#10
做一个bean,状态声明为session
里面有个static的vector
用户登陆的时候就往里面加一个。session失效的时候就减一个
如果登陆时候,发现重复的session就不让他登陆。
里面有个static的vector
用户登陆的时候就往里面加一个。session失效的时候就减一个
如果登陆时候,发现重复的session就不让他登陆。
#11
/**
* 当用户创建一个会话时,将用户该对象实力放入到再现用户列表中
* @param event
*/
public void valueBound(HttpSessionBindingEvent event) {
boolean dup = false;
for (int i = 0; i < UserSession.userList.size(); i++) {
UserSession u = (UserSession) UserSession.userList.get(i);
if (u != null
&& u.getUserName() != null
&& u.getUserId().equals(
this.getUserId())) { // forbid add a duplicate user
dup = true;
}
}
if (!dup) {
UserSession.userList.add(this);
}
System.out.println(this.userId + " added into userlist");
}
/**
* 当用户会话失效时,在再现用户表中将该对象实力删除
* @param event
*/
public void valueUnbound(HttpSessionBindingEvent event) {
UserSession.userList.remove(this);
System.out.println(this.userId + " remove from userlist");
}
* 当用户创建一个会话时,将用户该对象实力放入到再现用户列表中
* @param event
*/
public void valueBound(HttpSessionBindingEvent event) {
boolean dup = false;
for (int i = 0; i < UserSession.userList.size(); i++) {
UserSession u = (UserSession) UserSession.userList.get(i);
if (u != null
&& u.getUserName() != null
&& u.getUserId().equals(
this.getUserId())) { // forbid add a duplicate user
dup = true;
}
}
if (!dup) {
UserSession.userList.add(this);
}
System.out.println(this.userId + " added into userlist");
}
/**
* 当用户会话失效时,在再现用户表中将该对象实力删除
* @param event
*/
public void valueUnbound(HttpSessionBindingEvent event) {
UserSession.userList.remove(this);
System.out.println(this.userId + " remove from userlist");
}
#12
建议用hashmap记录用户session对象。用singleton或application对象来存放hashmap。
每当用户试图登陆的时候就开始在hashmap里查找是否已经存在该session
如果存在则销毁该session。重新建立该用户的session。把该session对象放入hashmap中。
如果不存在,建立用户的session,把该session放入hashmap中。
如果超时了,从hashmap删除该用户session对象。
这样做的后果是:如果有相同用户同时登陆,则强行销毁先登陆用户的session,用后登陆的用户登陆。(类型qq和msn的用户同时登陆机制)
每当用户试图登陆的时候就开始在hashmap里查找是否已经存在该session
如果存在则销毁该session。重新建立该用户的session。把该session对象放入hashmap中。
如果不存在,建立用户的session,把该session放入hashmap中。
如果超时了,从hashmap删除该用户session对象。
这样做的后果是:如果有相同用户同时登陆,则强行销毁先登陆用户的session,用后登陆的用户登陆。(类型qq和msn的用户同时登陆机制)
#13
为什么不用在数据库里设个字段?
表明用户的状态,在线就设为1,其余为0,在用户退出的时候把它置为0
登陆的时候置为1
这样关键就是防止用户直接点击关闭按钮,这个可以在页面的body里 onunload=“javascript:window.open("logout.jsp","","fullscreen=0,toolbar=1,scrollbars=1,menubar=1,location=0,width=10,height=10,top=0,left=0")”
在logout.jsp页面里注销session和更换数据库该用户的状态
表明用户的状态,在线就设为1,其余为0,在用户退出的时候把它置为0
登陆的时候置为1
这样关键就是防止用户直接点击关闭按钮,这个可以在页面的body里 onunload=“javascript:window.open("logout.jsp","","fullscreen=0,toolbar=1,scrollbars=1,menubar=1,location=0,width=10,height=10,top=0,left=0")”
在logout.jsp页面里注销session和更换数据库该用户的状态
#14
然后用widow.close();关闭logout.jsp
你觉得这样做怎么样?
你觉得这样做怎么样?
#15
用一个表记录上线情况1(上线)/0(下线)
#16
有这一建议
在用户表后加一字段,f_refresh datetime,f_sessionid
然后,在使用的页面上加一个iframe(子帧),如果是框架型的就在一个不变的框架上加,如果不是的话就在每个页面上加个包含页面
这个子帧每隔五秒刷新,更新f_refresh字段为当前日期、时间值
然后在登录页面加一个判断
如果系统当前时间与f_refresh 差别小于十秒或者f_sessionid不同,那么就不可以登陆
#17
tong yi: 用一个表记录上线情况1(上线)/0(下线)