我想要实现只要这个帐号一登录,其他的人再使用这个帐号不论是在本机还是其他机子上的都不能再使用登录了,除非注销登录,其他人可以使用。
我在网上找了很多,但是都说的不是很清楚,有的是通过记录session来判断的,有的是结合数据库实现的,但是都存在一个问题,如果要是机子断电,或者个alt+f4,或者是直接点浏览器的叉这样子的关闭,就清除不了 session的值,或者是改变不了数据库中用户的登录状态,恳请高人指点,最好可以附上代码。
我在网上找了很多,但是都说的不是很清楚,有的是通过记录session来判断的,有的是结合数据库实现的,但是都存在一个问题,如果要是机子断电,或者个alt+f4,或者是直接点浏览器的叉这样子的关闭,就清除不了 session的值,或者是改变不了数据库中用户的登录状态,恳请高人指点,最好可以附上代码。
解决方案 »
- Struts2的标签<s:password/>和<s:textfield type="password"/>的区别,求指点
- 将一段josn格式的字符串转化为Map
- 初学者遇到问题 求帮助
- MySQL在程序中运行包异常,ERROR 1067 (42000)
- 在weblogic 8.1上部署EJB时出错,在线等待
- 在eclipse中如何配置jboss
- 紧急提问。(无法解析格式不规范的HTML文件)怎么解决?在线等待
- weblogic8部署CMP的问题,哪位高手帮忙看看(含详细的代码)
- 能不能说一说web.xml中resource-ref与resource-env-ref的区别
- 在J2EE平台上的EJB开发,有没有人有经验啊?
- jasperreport
- db2
在html页面上使用ajax做一个心跳,每个一定时间向服务器提交一次,代表用户正在登录,如果过了一定的时间还是没有心跳认为用户已经下线,把用户id从map中删除,用户就可以再次登录。
对于map的操作需要同步。
登录的时候, 设置一个值, 再次登陆的 时候判断application里面是否有这个相对应的值
再有登录,首先验证这个空间里的用户,如果请求IP不同则不允许,反之则允许登录!可以有效防止alt+f4和断电的情况出现的拒绝登录问题。但是这个静态域又不等同于一楼说的那种长效的,具体点可以用一个独立运行的线程维护他的状态!设置一个退出前无操作状态下默认退出的时间,相当于一个队列,用户每次的请求相当于一个心跳(不用单独发送心跳),去更新这个等待时间,当两次请求间隔时间大于或等于这个时间值,假如用户名IP一致,则默认其在线状态。否则拒绝其操作,必须再次使用密码登录!当然要清除这个空间中的信息。简单说,超时时间内是在线的,重新登录的情况只有两种:用户正常退出和超出安全时间范围!
创建一个监听器,在session失效时解除数据库的登录状态(应对直接关闭浏览器的情况)
如果要做到强制前一个用户下线可以采用过滤器,当后面用户登录时发现该用户已经登录,在内存中记录sessionId,再在过滤器里面判断如果和当前sessionId相同时,强制session失效。
private static HashMap<String, User> hUserName = new java.util.HashMap<String, User>();//保存sessionID和username的映射
/**以下是实现HttpSessionListener中的方法**/
public void sessionCreated(HttpSessionEvent se) {
}
public void sessionDestroyed(HttpSessionEvent se) {
hUserName.remove(se.getSession().getId());
}
/*
* isAlreadyEnter-用于判断用户是否已经登录以及相应的处理方法
* @param sUserName String-登录的用户名称
* @return boolean-该用户是否已经登录过的标志
*/
public static boolean isAlreadyEnter(User vo){
boolean flag = false;
if(hUserName.containsValue(vo)){
flag = true;
}else{//如果该用户没登录过,直接添加现在的sessionID和username
flag = false;
}
return flag;
}
/*
* isAlreadyEnter-用于判断用户是否已经登录以及相应的处理方法
* @param sUserName String-登录的用户名称
* @return boolean-该用户是否已经登录过的标志
*/
public static boolean updateAlreadyEnter(HttpSession session,User vo){
boolean flag = false;
if(hUserName.containsValue(vo)){//如果该用户已经登录过,则使上次登录的用户掉线(依据使用户名是否在hUserName中)
//遍历原来的hUserName,删除原用户名对应的sessionID(即删除原来的sessionID和username)
Iterator iter = hUserName.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry)iter.next();
//Object key = entry.getKey();
Object val = entry.getValue();
if(val.equals(vo)){
iter.remove();
}
}
hUserName.put(session.getId(),vo);//添加现在的sessionID和username
flag = true;
}else{//如果该用户没登录过,直接添加现在的sessionID和username
flag = false;
hUserName.put(session.getId(),vo);
}
return flag;
}
/*
* isOnline-用于判断用户是否在线
* @param session HttpSession-登录的用户名称
* @return boolean-该用户是否在线的标志
*/
public static boolean isOnline(HttpSession session){
boolean flag = true;
if( hUserName.containsKey(session.getId())){
flag = true;
}
else{
flag = false;
}
return flag;
}
} 当时想实现这个功能,没有成功,这儿只有我找到的代码,希望楼主实现后把代码帖出来共享给大家。
http://blog.csdn.net/nihaozhangchao/archive/2010/04/06/5453311.aspx一个不错的文章存到数据库也是一个办法。不过需要付负一定的资源。。所以成于不成还要看自己怎么想怎么办。。