做人第一 学习第二

java web监听器统计在线用户及人数

在线用户使用HttpSessionListener监听器统计  

每当一个session会话建立  在线用户人数+1

每当一个session会话销毁 在线用户人数-1


使用ServletRequestListener监听器统计用户信息

每当一个request建立  将当前用户放入集合

每当session会话销毁  将当前用户移出集合


我使用的是Servlet3.0  监听器直接使用注解@webListener即可 不用在web.xml中布局

在web.xml中配置session-timeout标签  标志session过期时间为1分钟  0为不过期


<session-config>  
    <session-timeout>1</session-timeout>  
</session-config>

servlet3.0使用条件



运行结果:


由于session对话关闭时间并不一定以设置的1分钟为准 所以 gif图像中最后等待时间较长

User 实体类

package com.scx.entity;  
  
  
/** 
 * 用户实体类 
 * 
 */  
public class User {  
    //当前用户的session id  
    private String sessionId;  
    //当前用户的ip地址  
    private String ip;  
    //当前用户第一次访问的时间  
    private String firstTime;  
    public User() {  
        super();  
          
    }  
    public String getIp() {  
        return ip;  
    }  
    public void setIp(String ip) {  
        this.ip = ip;  
    }  
    public String getFirstTime() {  
        return firstTime;  
    }  
    public void setFirstTime(String firstTime) {  
        this.firstTime = firstTime;  
    }  
    public String getSessionId() {  
        return sessionId;  
    }  
    public void setSessionId(String sessionId) {  
        this.sessionId = sessionId;  
    }  
      
}


HttpSessionListener监听器

package com.scx.listener;  
  
import java.util.ArrayList;  
import javax.servlet.annotation.WebListener;  
import javax.servlet.http.HttpSessionEvent;  
import javax.servlet.http.HttpSessionListener;  
  
import com.scx.entity.User;  
import com.scx.util.SessionUtil;  
/** 
 * HttpSessionListener 监听器 
 * 
 */  
@WebListener  
public class MyHttpSessionListener implements HttpSessionListener{  
    //当前用户数  
    private int userCounts=0;  
    @Override  
    public void sessionCreated(HttpSessionEvent se) {  
        //sessionCreated  用户数+1  
        userCounts++;  
        //重新在servletContext中保存userCounts  
        se.getSession().getServletContext().setAttribute("userCounts", userCounts);  
          
    }  
    @Override  
    public void sessionDestroyed(HttpSessionEvent se) {  
        //sessionDestroyed  用户数-1  
        userCounts--;  
        //重新在servletContext中保存userCounts  
        se.getSession().getServletContext().setAttribute("userCounts", userCounts);  
          
        @SuppressWarnings("unchecked")  
        ArrayList<User> userList=(ArrayList<User>) se.getSession().getServletContext().getAttribute("userList");  
        String sessionId=se.getSession().getId();  
        //如果当前用户在userList中  在session销毁时  将当前用户移出userList  
        if(SessionUtil.getUserBySessionId(userList, sessionId)!=null){  
            userList.remove(SessionUtil.getUserBySessionId(userList, sessionId));  
        }  
        //将userList集合  重新保存到servletContext  
        se.getSession().getServletContext().setAttribute("userList", userList);  
    }  
  
}


ServletRequestListener监听器

package com.scx.listener;  
  
import java.text.SimpleDateFormat;  
import java.util.ArrayList;  
import java.util.Date;  
import javax.servlet.ServletRequestEvent;  
import javax.servlet.ServletRequestListener;  
import javax.servlet.annotation.WebListener;  
import javax.servlet.http.HttpServletRequest;  
import com.scx.entity.User;  
import com.scx.util.SessionUtil;  
  
/** 
 * ServletRequestListener 监听器 
 * 
 */  
@WebListener  
public class MyServletRequestListener implements ServletRequestListener {  
    //用户集合  
    private ArrayList<User> userList;  
    @Override  
    public void requestDestroyed(ServletRequestEvent arg0) {  
              
    }  
  
    @SuppressWarnings("unchecked")  
    @Override  
    public void requestInitialized(ServletRequestEvent arg0) {  
        //从servletContext中获的userList  
        userList=(ArrayList<User>) arg0.getServletContext().getAttribute("userList");  
        //如果servletContext中没有userList对象  初始化userList  
        if(userList==null){  
            userList=new ArrayList<User>();  
        }  
        HttpServletRequest request=(HttpServletRequest) arg0.getServletRequest();  
          
        //sessionId  
        String sessionId=request.getSession().getId();  
        //如果当前sessionId不存在集合中  创建当前user对象  
        if(SessionUtil.getUserBySessionId(userList,sessionId)==null){  
            User user=new User();  
            user.setSessionId(sessionId);  
            user.setIp(request.getRemoteAddr());  
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:MM:ss");  
            user.setFirstTime(sdf.format(new Date()));  
            userList.add(user);  
        }  
        //将userList集合 保存到ServletContext  
        arg0.getServletContext().setAttribute("userList", userList);  
    }  
}


工具类

package com.scx.util;  
  
import java.util.ArrayList;  
  
import com.scx.entity.User;  
  
public class SessionUtil {  
    //根据sessionId判断当前用户是否存在在集合中  如果存在 返回当前用户  否则返回null  
    public static User getUserBySessionId(ArrayList<User> userList,String sessionId) {  
        for (User user : userList) {  
            if(sessionId.equals(user.getSessionId())){  
                return user;  
            }  
        }  
        return null;  
    }  
}
此文如未标注转载均为本站原创,自由转载请表明出处 宋子宪博客 » java web监听器统计在线用户及人数

发表评论

游客 表情
送你一朵小花花~

帅人已评:(0)