解决在线用户列表和重复登录

http://xiaozhuo.javaeye.com/blog/445461

解决两个问题:
1. 实现在线用户列表
2. 当用户在异地登录后,使前一次登录自动退出

实现方法:
用户登录时,会创建一个session,用于保存用户信息。将所有用户登录时的session值与ID存入ServletContext中,显示在线列表的时候,就从ServletContext中取得用户登录的session值,从中取得用户信息。
1. 登录:
先从ServletContext中取出存放用户登录的session 相关信息,检查这个列表,如果已经存在相同的登录信息,则说明用户之前已经登录过,移除前面一条记录。
再把此次登录的信息加入到ServletContext中。
2.监听:
实现SessionListener类,当session失效的时候,从ServletContext中移除相应记录。
3.过滤:
过滤所有页面,sesison失效后转向登录页面。但是要实现用户二次登录后强制先前的登录失效,需要在这里控制。
登录时存入的是session值和session ID,用户二次登录时移除了前线记录,存入的session值是相同的,但是ID却不同。
当第一次登录的页面请求的时候,在这里检查ServletContext中是否存在当前的session值与ID记录。如果没有就销毁这个session。

参考代码:
存放的时候有很多中方法,我选择的是将session值与ID先存入一个List,在将这个List存入另一个List,再存到ServletContext中。
代码仅供参考,有不合理的地方,希望大家给出意见。

============================1. 登录部分============================

Java代码
  1. //先从ServletContext中获得存放sessioninfo的List    
  2. List userlist = (List) this .servlet.getServletContext()   
  3.                          .getAttribute("userlist" );   
  4. //如果是首个用户登录,sessionlist为空,new一个    
  5. if  (userlist ==  null ) {   
  6.        userlist = new  ArrayList();   
  7.     }   
  8. //遍历List    
  9. for  ( int  i =  0 ; i < userlist.size(); i++) {   
  10.        List sessionInfoTemp = (List) userlist.get(i);   
  11.        //检查是否存在一个与当前session值相同,但是ID不同的记录    
  12. if (sessionInfoTemp.get( 0 ).toString().equals(session.getAttribute( "emp" ).toString())&& !(sessionInfoTemp.get( 1 ).equals(session.getId()))) {   
  13.                          //如果存在,remove这一记录    
  14.                          userlist.remove(sessionInfoTemp);   
  15.               }   
  16.     }   
  17. // 把session值、ID 存入 sessioninfo    
  18. List sessioninfo = new  ArrayList();   
  19. sessioninfo.add(session.getAttribute("emp" ));   
  20. sessioninfo.add(session.getId());   
  21. //sessioninfo 存入 List    
  22. userlist.add(sessioninfo);   
  23. //List存入ServletContext    
  24. this .servlet.getServletContext().setAttribute( "userlist" , userlist);   
//先从ServletContext中获得存放sessioninfo的List 
List userlist = (List) this.servlet.getServletContext() 
                         .getAttribute("userlist"); 
//如果是首个用户登录,sessionlist为空,new一个 
if (userlist == null) { 
       userlist = new ArrayList(); 
    } 
//遍历List 
for (int i = 0; i < userlist.size(); i++) { 
       List sessionInfoTemp = (List) userlist.get(i); 
       //检查是否存在一个与当前session值相同,但是ID不同的记录 
if(sessionInfoTemp.get(0).toString().equals(session.getAttribute("emp").toString())&& !(sessionInfoTemp.get(1).equals(session.getId()))) { 
                         //如果存在,remove这一记录 
                         userlist.remove(sessionInfoTemp); 
              } 
    } 
// 把session值、ID 存入 sessioninfo 
List sessioninfo = new ArrayList(); 
sessioninfo.add(session.getAttribute("emp")); 
sessioninfo.add(session.getId()); 
//sessioninfo 存入 List 
userlist.add(sessioninfo); 
//List存入ServletContext 
this.servlet.getServletContext().setAttribute("userlist", userlist); 



============================2. 监听部分============================

Java代码
  1. public   void  sessionDestroyed(HttpSessionEvent arg0) {   
  2.        // TODO Auto-generated method stub    
  3.     HttpSession session = arg0.getSession();   
  4.     if (session.getAttribute( "emp" )!= null ){   
  5.     List list = (List)session.getServletContext().getAttribute("userlist" );   
  6.     List userTemp = new  ArrayList();   
  7.     userTemp.add(session.getAttribute("emp" ));   
  8.     userTemp.add(session.getId());   
  9.     list.remove(userTemp);   
  10.     session.getServletContext().setAttribute("userlist" , list);   
  11.     }   
  12. }   
public void sessionDestroyed(HttpSessionEvent arg0) { 
       // TODO Auto-generated method stub 
    HttpSession session = arg0.getSession(); 
    if(session.getAttribute("emp")!=null){ 
    List list = (List)session.getServletContext().getAttribute("userlist"); 
    List userTemp = new ArrayList(); 
    userTemp.add(session.getAttribute("emp")); 
    userTemp.add(session.getId()); 
    list.remove(userTemp); 
    session.getServletContext().setAttribute("userlist", list); 
    } 
} 



============================3. 过滤部分============================

Java代码
  1. public   void  doFilter(ServletRequest req, ServletResponse res,   
  2.            FilterChain chain) throws  IOException, ServletException {   
  3.   
  4.        HttpServletRequest request = (HttpServletRequest) req;   
  5.        HttpServletResponse response = (HttpServletResponse) res;   
  6.        HttpSession session = request.getSession();   
  7.   
  8.        /**   
  9. * 同一用户二次登陆问题 用户请求的提交到这里,通过检查List总的记录销毁session   
  10.         */    
  11.        // 从ServletContext中取出List    
  12. List sessionlist = (List) session.getServletContext().getAttribute(   
  13.               "userlist" );   
  14.        if  (sessionlist ==  null ) {   
  15.            sessionlist = new  ArrayList();   
  16.        }   
  17.        // 用于记录状态    
  18.        boolean  temp =  false ;   
  19.        Iterator it = sessionlist.iterator();   
  20.        while  (it.hasNext()) {   
  21.            List sessioninfo = (List) it.next();   
  22.   
  23.            /**   
  24.             * 判断: 如果sessioninfo中没有当前session的值与ID信息,则表明该用户已经第二次登陆了   
  25.             * 登陆的时候第一次登陆时候的信息被从List中移除了。   
  26.             */    
  27.            if  (sessioninfo.get( 0 ).toString().equals(   
  28.                   session.getAttribute("emp" ).toString())   
  29.                   && sessioninfo.get(1 ).equals(session.getId())) {   
  30.               // session值与当前ID匹配    
  31.               temp = true ;   
  32.            }   
  33.        }   
  34.        // 存在了第二次登陆,销毁session    
  35.         if  (!temp) {   
  36.            session.invalidate();   
  37.        }   
  38.   
  39.        String strSession = null ;   
  40.        try  {   
  41.            strSession = session.getAttribute("emp" ).toString();   
  42.        } catch  (Exception e) {   
  43.        }   
  44.        /**   
  45.         * 如果session为空,返回登陆页面   
  46.         */    
  47.        if  (strSession ==  null ) {   
  48.            response.setCharacterEncoding("gb2312" );   
  49.            response   
  50.                   .getOutputStream()    .print("<script>window.top.location.href='/index.jsp';alert('超时或账号在其它地方登录,请重新登录!');</script>" );   
  51.        } else  {   
  52.            chain.doFilter(req, res);   
  53.        }   
  54.     }  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值