一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

jsp web中实现同一帐号同一时间只能一个地点登陆

时间:2011-05-09 编辑:简简单单 来源:一聚教程网

jsp web中实现同一帐号同一时间只能一个地点登陆 一、该功能有什么作用 大家想想吧。反正总会有这样的需求的。这年头什么需求不会有。。呵呵。有时候也不一定是需求,很有可能为了安全也会这么做。例如考试系统,在线聊天系统,很有必要做成这样的吧。 二、实现过程 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 com.weirhp; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class RecordSessionListener implements HttpSessionAttributeListener, HttpSessionListener { private static List sessions; public static String loginFlag = "loginUser"; static { if (sessions == null) { sessions = Collections.synchronizedList(new ArrayList()); } } public void attributeAdded(HttpSessionBindingEvent e) { HttpSession session = e.getSession(); System.out.println("-------------*start added*-----------------------"); String attrName = e.getName(); // 登录 if (attrName.equals(loginFlag)) { User nowUser = (User) e.getValue(); User sUser = (User)session.getAttribute(loginFlag); // 遍历所有session for (int i = sessions.size()-1; i >= 0; i--) { SessionAndUser tem = sessions.get(i); if (tem.getUserID().equals(nowUser.getName())) { tem.getSession().invalidate();//自动调用remove break; } } SessionAndUser sau = new SessionAndUser(); sau.setUserID(nowUser.getName()); sau.setSession(session); sau.setSid(session.getId()); sessions.add(sau); } } public void attributeRemoved(HttpSessionBindingEvent e) { HttpSession session = e.getSession(); System.out.println("-------------*start Removed*-----------------------"); String attrName = e.getName(); // 登录 if (attrName.equals(loginFlag)) { User nowUser = (User) e.getValue(); // 遍历所有session for (int i = sessions.size()-1; i >= 0; i--) { SessionAndUser tem = sessions.get(i); if (tem.getUserID().equals(nowUser.getName())) { sessions.remove(i); break; } } } } public void attributeReplaced(HttpSessionBindingEvent e) { HttpSession session = e.getSession(); System.out.println("-------------*start replace*-----------------------"); String attrName = e.getName(); int delS=-1; // 登录 if (attrName.equals(loginFlag)) { // User nowUser = (User) e.getValue();//old value User nowUser = (User)session.getAttribute(loginFlag);//当前session中的user // 遍历所有session for (int i = sessions.size()-1; i >= 0; i--) { SessionAndUser tem = sessions.get(i); if (tem.getUserID().equals(nowUser.getName())&&!tem.getSid().equals(session.getId())) { System.out.println("Remove:invalidate 1!"); delS=i; }else if(tem.getSid().equals(session.getId())){ tem.setUserID(nowUser.getName()); } } if (delS!=-1) { sessions.get(delS).getSession().invalidate();//失效时自动调用了remove方法。也就会把它从sessions中移除了 } } } public void sessionCreated(HttpSessionEvent e) { } public void sessionDestroyed(HttpSessionEvent e) { } } 在web.xml中的配制 1 2 recordSession 3 com.weirhp.RecordSessionListener 4

热门栏目