首页 > 代码库 > java web监听器统计在线用户及人数

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监听器统计在线用户及人数