问题描述
我想要实现只要这个帐号一登录,其他的人再使用这个帐号不论是在本机还是其他机子上的都不能再使用登录了,除非注销登录,其他人可以使用。我在网上找了很多,但是都说的不是很清楚,有的是通过记录session来判断的,有的是结合数据库实现的,但是都存在一个问题,如果要是机子断电,或者个alt+f4,或者是直接点浏览器的叉这样子的关闭,就清除不了session的值,或者是改变不了数据库中用户的登录状态,恳请高人指点,最好可以附上代码。
解决方案
解决方案二:
可以提供lz一个思路在应用程序启动时建立一个静态map存储用户id,当有用户登录时,查看map中是否存在该用户,如果存在就不许用户登录,如果不存在就允许用户登录。在html页面上使用ajax做一个心跳,每个一定时间向服务器提交一次,代表用户正在登录,如果过了一定的时间还是没有心跳认为用户已经下线,把用户id从map中删除,用户就可以再次登录。对于map的操作需要同步。
解决方案三:
友情帮顶,友情帮顶
解决方案四:
需要用定时刷新的方式,缺点就是会有一点延迟。可以借鉴一下QQ的方式,就是上线的时候把不是的人强制踢下线。
解决方案五:
可以用application去管理啊登录的时候,设置一个值,再次登陆的时候判断application里面是否有这个相对应的值
解决方案六:
1楼方案不错。
解决方案七:
引用3楼dahaidao的回复:
需要用定时刷新的方式,缺点就是会有一点延迟。可以借鉴一下QQ的方式,就是上线的时候把不是的人强制踢下线。
這個比較好些
解决方案八:
我也有个思路,创建一个session的同时,记录下ip和用户名作关联,服务器创建一个静态域,状态可以保持到用户正常退出。再有登录,首先验证这个空间里的用户,如果请求IP不同则不允许,反之则允许登录!可以有效防止alt+f4和断电的情况出现的拒绝登录问题。但是这个静态域又不等同于一楼说的那种长效的,具体点可以用一个独立运行的线程维护他的状态!设置一个退出前无操作状态下默认退出的时间,相当于一个队列,用户每次的请求相当于一个心跳(不用单独发送心跳),去更新这个等待时间,当两次请求间隔时间大于或等于这个时间值,假如用户名IP一致,则默认其在线状态。否则拒绝其操作,必须再次使用密码登录!当然要清除这个空间中的信息。简单说,超时时间内是在线的,重新登录的情况只有两种:用户正常退出和超出安全时间范围!
解决方案九:
浏览器关闭,会话关闭,session关闭。。。。
解决方案十:
怎么做一个ajax的心跳啊?什么意思呢?具体要怎么做?
解决方案十一:
登录时,数据库记录下当前登录的sessionId创建一个监听器,在session失效时解除数据库的登录状态(应对直接关闭浏览器的情况)如果要做到强制前一个用户下线可以采用过滤器,当后面用户登录时发现该用户已经登录,在内存中记录sessionId,再在过滤器里面判断如果和当前sessionId相同时,强制session失效。
解决方案十二:
保存用户名到session对象,同时在数据库中做标记,在别人注销或者session对象销毁的时候改变数据库里面的标记,每次登陆的时候可以通过数据库里面的标记进行判断
解决方案十三:
记录ip地址咯,,
解决方案十四:
publicclassOnlineUserimplementsHttpSessionListener{privatestaticHashMap<String,User>hUserName=newjava.util.HashMap<String,User>();//保存sessionID和username的映射/**以下是实现HttpSessionListener中的方法**/publicvoidsessionCreated(HttpSessionEventse){}publicvoidsessionDestroyed(HttpSessionEventse){hUserName.remove(se.getSession().getId());}/**isAlreadyEnter-用于判断用户是否已经登录以及相应的处理方法*@paramsUserNameString-登录的用户名称*@returnboolean-该用户是否已经登录过的标志*/publicstaticbooleanisAlreadyEnter(Uservo){booleanflag=false;if(hUserName.containsValue(vo)){flag=true;}else{//如果该用户没登录过,直接添加现在的sessionID和usernameflag=false;}returnflag;}/**isAlreadyEnter-用于判断用户是否已经登录以及相应的处理方法*@paramsUserNameString-登录的用户名称*@returnboolean-该用户是否已经登录过的标志*/publicstaticbooleanupdateAlreadyEnter(HttpSessionsession,Uservo){booleanflag=false;if(hUserName.containsValue(vo)){//如果该用户已经登录过,则使上次登录的用户掉线(依据使用户名是否在hUserName中)//遍历原来的hUserName,删除原用户名对应的sessionID(即删除原来的sessionID和username)Iteratoriter=hUserName.entrySet().iterator();while(iter.hasNext()){Map.Entryentry=(Map.Entry)iter.next();//Objectkey=entry.getKey();Objectval=entry.getValue();if(val.equals(vo)){iter.remove();}}hUserName.put(session.getId(),vo);//添加现在的sessionID和usernameflag=true;}else{//如果该用户没登录过,直接添加现在的sessionID和usernameflag=false;hUserName.put(session.getId(),vo);}returnflag;}/**isOnline-用于判断用户是否在线*@paramsessionHttpSession-登录的用户名称*@returnboolean-该用户是否在线的标志*/publicstaticbooleanisOnline(HttpSessionsession){booleanflag=true;if(hUserName.containsKey(session.getId())){flag=true;}else{flag=false;}returnflag;}}
当时想实现这个功能,没有成功,这儿只有我找到的代码,希望楼主实现后把代码帖出来共享给大家。
解决方案十五:
是这样的!受教了!~
解决方案:
引用3楼dahaidao的回复:
需要用定时刷新的方式,缺点就是会有一点延迟。可以借鉴一下QQ的方式,就是上线的时候把不是的人强制踢下线。
不错不错!!!
解决方案:
使用memcache来存放已经登陆的用户信息以用户名作为key值当登陆的时候用用户名去memcache中查找如果存在就提示帐号不能重复登陆。关于
解决方案:
哦是memcached
解决方案:
可以看下springsecurity的source,看看它是怎么实现会话管理的
解决方案:
好多种方式。。其实就是当某一个用户登陆时把他存到一个共享中。。当另一个人想登陆时,,就看这个其享中是否这个人还在,如果不在就登陆,如果还在则不让登陆。session--》当一个用户登陆时就创建一个session所以不能单单靠session来完成所以用一个静态的HashMap是很不错的想法。memcached缓存也是一个不错的想法。。。至于memcached的使用。一个不错的文章存到数据库也是一个办法。不过需要付负一定的资源。。所以成于不成还要看自己怎么想怎么办。。
解决方案:
ajax定时去判断状态
解决方案:
我记得淘宝也是用的重复登录把前一个踢下去的机制的,这个很容易实现。
解决方案:
mark,待后日学习!
解决方案:
积分在那里弄的/怎么我弄不到啊
解决方案:
学习一下
解决方案:
引用8楼johnstrive的回复:
浏览器关闭,会话关闭,session关闭。。。。
这里就行了!
解决方案:
引用1楼tgbmlp的回复:
可以提供lz一个思路在应用程序启动时建立一个静态map存储用户id,当有用户登录时,查看map中是否存在该用户,如果存在就不许用户登录,如果不存在就允许用户登录。在html页面上使用ajax做一个心跳,每个一定时间向服务器提交一次,代表用户正在登录,如果过了一定的时间还是没有心跳认为用户已经下线,把用户id从map中删除,用户就可以再次登录。对于map的操作需要同步。
不错的思路
解决方案:
在用户表中设置标志位(0:不在线,1:在线)登陆更改为1,退出时更改为0,登录时判断就可以了。
解决方案:
mark。。肯定用的着。。
解决方案:
也顶一下,期待高人!