2024年4月30日发(作者:)
又有好多天没有写博客了,最近有网友问我,在java web中如何实现像QQ登录的功能,
同一帐号不能同时在两台电脑上登录。
一、该功能有什么作用
大家想想吧。反正总会有这样的需求的。这年头什么需求不会有。。呵呵。有时候也不
一定是需求,很有可能为了安全也会这么做。例如考试系统,在线聊天系统,很有必要做成
这样的吧。
二、实现过程
a.问题分析
在系统中,我们一般都是把登录信息绑定到session中,看来从这入手是可能找
到解决办法。说白了,也就是当用户登录时,判断一下这个用户有没有登录,如果登录了,
就把以前的那个session清除掉就OK了。。看似很简单是不?其实你细想你会发现有以
下问题:如何得到之前这个用户有没有登录过,也就是如何访问到所有登录的session信
息呢?
b.具体实现
大家知道,在j2ee api好像是没有具体的方法直接得到所有session信息的。但是
我们可以通过配制监听器,监控所有的session创建和消毁过程,以及可以监控session
中的属性的创建,删除和替换过程。
其实我们只要做以下处理即可:
在保存用户登录信息到session时,对应的也就是session一个属性的创建过
程(attributeAdded),可以把当前这个session记录到一个ArrayList中。
其实在保存到list中时你要首先遍历一下这个list中有没有已经存在该用户的登
录信息。如果存在就消毁掉这个list中存在的session信息,并且从list中移除,不存在
就把该session信息放到list中。
在session的登录信息消毁时,直接把该sesseion从list中移除掉。
还有就是当用户登录后没有退出直接登录这个时候是一个session属性的替换
过程。也要做处理判断新的用户是否已经在除了当前session的其它session中是否存在。
存在则删除。
具体代码如下:
package ;
import ist;
import tions;
import ;
import ssion;
import ssionAttributeListener;
import ssionBindingEvent;
import ssionEvent;
import ssionListener;
public class RecordSessionListener implements HttpSessionAttributeListener,
HttpSessionListener {
private static List
public static String loginFlag = "loginUser";
static {
if (sessions == null) {
sessions = onizedList(new ArrayList
}
}
public void attributeAdded(HttpSessionBindingEvent e) {
HttpSession session = sion();
n("-------------*start added*-----------------------");
String attrName = e();
// 登录
if ((loginFlag)) {
User nowUser = (User) ue();
User sUser = (User)ribute(loginFlag);
// 遍历所有session
for (int i = ()-1; i >= 0; i--) {
SessionAndUser tem = (i);
if (rID().equals(e())) {
sion().invalidate();//自动调用remove
break;
}
}
SessionAndUser sau = new SessionAndUser();
rID(e());
sion(session);
(());
(sau);
}
}
发布评论