application和session都可以实现这些功能

解决方案 »

  1.   

    防止重复在线,统计在线人数通常由三种办法:1.通过数据库的记录 2.使用ServletContext类型的application3.采用session.第一种做法较简单但会给数据库造成负担.第二种做法还没去实现.:)本文实现了采用session的做法,基本思想就是正常登陆的时候建立一个session记录登陆名字,此时激发监听器。代码如下:1。登陆时假设登陆名loginINFO[0],建立session记录登陆名字。if(rs_login.next()){
               Login_servlet.logger.info("登陆验证成功");//log4j
                 OnLineUser OLU=new OnLineUser();//
               if  (!OLU.existUser(loginINFO[0])){  
                  Login_servlet.logger.info("重复登陆");
            return;
                         
                    }else{  
                          session.setMaxInactiveInterval(3000); //session的生命周期
                            session.setAttribute(loginINFO[0],OLU);    
                           
                   
                    }  2.监听器代码:OnLineUser/*
     * 创建日期 2005-5-12
     *
     * 目的:
     * 
     */
    package cn.wst.common.onLine;import javax.servlet.http.HttpSessionBindingEvent;
    import javax.servlet.http.HttpSessionBindingListener;
      import org.apache.log4j.Logger;
    import  java.util.*;
    /**
     * @author wangshangting
     *
     * 目的:
     * 用于统计在线人数,防止统一帐号登陆,退出取消账号
     */
    public  class OnLineUser implements HttpSessionBindingListener{  
    //    private static OnLineUser instance = null;//    synchronized public static OnLineUser getInstance()//singleton模式,确保只有一个OnLineUser实例
    //    {
    //    if( instance == null )
    //    {
    //        instance = new OnLineUser();
    //    }
    //    return instance;
    //    }    
        
        static Logger logger = Logger.getLogger(OnLineUser.class.getName());
        public  OnLineUser(){  
        }      private static Vector  users=new  Vector();  //静态变量!!!!!!!!!!!!
        private int i=1;
        public  int  getCount(){  
          
                users.trimToSize();  
        
                return  users.capacity();  
        }  
        public  boolean  existUser(String  userName){  
                users.trimToSize();  
                boolean  existUser=true;  
                for  (int  i=0;i<users.capacity();i++  )  
                {  
                        if  (userName.equals((String)users.get(i)))  
                        {  
                                existUser=false;  
                                OnLineUser.logger.info(users.get(i));
                                OnLineUser.logger.info("重复");
                                break;  
                        }  
                }  
                return  existUser;  
        }      
        public  boolean  deleteUser(String  userName)  {  
            OnLineUser.logger.info("移除开始!!");
                users.trimToSize();  
          
                if(!existUser(userName)){  
                        int  currUserIndex=-1;  
                        for(int  i=0;i<users.capacity();i++){  
                                if(userName.equals((String)users.get(i))){  
                    //                OnLineUser.logger.info("找到");
                                        currUserIndex=i;  
                                        break;  
                                }  
                        }  
                        if  (currUserIndex!=-1){  
                             OnLineUser.logger.info("移除:"+currUserIndex);
                                users.remove(currUserIndex);  
                                users.trimToSize();  
                                return  true;  
                        }  
                        
                }  
                return  false;  
        }      public  Vector  getOnLineUser()  
        {  
                return  users;  
        }  
        
            public  void  valueBound(HttpSessionBindingEvent  e)  {  
                users.trimToSize();  
        
                        users.add(e.getName());                      
                        OnLineUser.logger.info(e.getName()+"\t      登入到系统\t"+(new  Date()));  
                        OnLineUser.logger.info("第"+i+"进入");
                        i++;
             
                        for(int i = 0;i < users.size();i++){
                            OnLineUser.logger.info(""+i+":"+users.get(i));
                        }
                      
                        System.out.println("            在线用户数为:"+getCount());   
                        
               }
     
                    
            /**
             * 
             */
            public  void  valueUnbound(HttpSessionBindingEvent  e)  {  
                users.trimToSize();  
                String  userName=e.getName();              deleteUser(userName);             OnLineUser.logger.info(userName+"\t      退出系统\t"+(new  Date()));  
                OnLineUser.logger.info("            在线用户数为:"+getCount());  
            }  
    }  
    3. 要记得在web.xml的所有servlet之前生命 OnLineUser,<listener>
     <listener-class>cn.wst.common.onLine.OnLineUser </listener-class>
     </listener
      

  2.   


    唉,还是自己做出来了用session,和 HttpSessionBindingListener接口主要思路:用一个单例模式的类UserListBean存在线用户名的聚集,然后还有一个类UserTraceBean,用于跟踪用户的在线情况,(利用HttpSessionBindingListener接口,如果用户登出或session过期,则删除USERLISTzhong)
      

  3.   


    ---------UserListBean--------------------package com.yaowj.mynet.models;import java.util.*;/**
     * @author ywj
     *
     * TODO To change the template for this generated type comment go to
     * Window - Preferences - Java - Code Style - Code Templates
     */
    public class UserListBean {
        
    private Vector container;
    private static UserListBean instance = new UserListBean(); 

    private UserListBean(){
    container = new Vector();
    }

    public static UserListBean getInstance(){
    return instance;
    }

    public void addUser(String user){
    container.addElement(user);
    }

    public void removeUser(String user){
    container.removeElement(user);
    }

    public Enumeration getList(){
    return container.elements();
    }

    }
      

  4.   


    -----------UserTraceBean ------------------
    package com.yaowj.mynet.models;import java.util.*;
    import javax.servlet.http.*;
    import com.yaowj.mynet.models.UserListBean;/**
     * @author ywj
     *
     * TODO To change the template for this generated type comment go to
     * Window - Preferences - Java - Code Style - Code Templates
     */
    public class UserTraceBean implements HttpSessionBindingListener{ private String user_name;
    private UserListBean container = UserListBean.getInstance();

    /**
     * @return Returns the user_name.
     */
    public String getUser_name() {
    return user_name;
    }
    /**
     * @param user_name The user_name to set.
     */
    public void setUser_name(String user_name) {
    this.user_name = user_name;
    }

    public void valueBound(HttpSessionBindingEvent e){
    container.addUser(user_name);
    }
    public void valueUnbound(HttpSessionBindingEvent e){
    container.removeUser(user_name);
    }
    }