java使用监听器实现对在线用户的统计

主要功能:统计当前连接客服端的数目以及客服端的信息

实现方法:使用了两个监听器,一个request用户请求的监听,用于获取用户的信息,一个HttpSession监听,则统计用户的数量

request监听器代码如下:

package Litener;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;

import Idea.Judge;
import user.UserInformation;
//从request中获取用户的信息并保存到Servletcontext对象中
@WebListener
public class RequestListener implements ServletRequestListener {
	//创建user集合,保存当前连接的用户信息
	    List<UserInformation>   userlist= new ArrayList<UserInformation>();

	@Override
	public void requestDestroyed(ServletRequestEvent arg0) {
		System.out.println("requestDestroyed执行完毕");
	}

	@Override
	public void requestInitialized(ServletRequestEvent arg0) {
		     Judge  j= new Judge();
	          //当客服端发送请求时,记录下客服端的信息
	              HttpServletRequest   request  =  (HttpServletRequest)arg0.getServletRequest();
	              //获取到用户的地址
	               String   ip= request.getRemoteAddr();
	               //获取用户的SessionId
	               String  SessionId=request.getSession().getId();
	               //将获取到的客服端信息保存到userInformation对象中,先判断集合中是否已经存在该客服端对象
	               if( j.judge( userlist,SessionId) ==null ){
	            	   UserInformation  user= new UserInformation();
	            	   user.setIp(ip);
	            	   user.setSessionId(SessionId);
	            	   user.setUsername(new SimpleDateFormat("yyyy年MM月dd日     HH:mm分ss秒").format(new Date()));
	            	 //添加到集合userlist中
	            	   userlist.add(user);
	            	      	   
	               }
	               //保存到ServletContext对象中
	               request.getSession().getServletContext().setAttribute("userlist", userlist);
	               System.out.println("保存完毕");
	              

	}

HttpSession监听器代码如下:

package Litener;

import java.util.List;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import user.UserInformation;
import Idea.Judge;

@WebListener
//用于统计用户的数目
public class SessionListener implements HttpSessionListener {
	private  int  number=0;
	Judge  j= new Judge();

	@Override
	public void sessionCreated(HttpSessionEvent arg0) {
		//当会话创建时数目++,并保存到web项目对象Servletcontext中
		          number++;
		          arg0.getSession().getServletContext().setAttribute("number", number);

	}

	@Override
	public void sessionDestroyed(HttpSessionEvent arg0) {
		     number--;
            arg0.getSession().getServletContext().setAttribute("number", number);
            
            
            //获取一下request对象
            List<UserInformation>  userlist = ( List<UserInformation>)arg0.getSession().getServletContext().getAttribute("userlist");
            String   SessionId=arg0.getSession().getId();
            
            //当会话结束的时候则删去该客服端,而不是在客服端请求结束的时候
            //先判断是否存在该客服端集合在userlist集合中
            if(  j.judge(userlist,SessionId)!=null){
                 UserInformation  user= j.judge(userlist,SessionId);
                 //删除客服端
            	userlist.remove(user);	
            }
            arg0.getSession().getServletContext().setAttribute("userlist", userlist);  
            

	}

}
 一个UserInformation类,用于保存用户的信息,代码如下:

package user;

import java.util.Date;

public class UserInformation {
	
	private  String  ip;
	private  String  SessionId;
	private  String  date   ;
	public String getIp() {
		return ip;
	}
	public void setIp(String ip) {
		this.ip = ip;
	}
	public String getSessionId() {
		return SessionId;
	}
	public void setSessionId(String sessionId) {
		SessionId = sessionId;
	}
	public String getDate() {
		return date;
	}
	public void setUsername( String  date) {
		this.date = date;
	}
	
	
}

 judge类,有一个判断的方法,判断在客服端对象的集合Userlist中是否已经包含了该用户,代码如下:

package Idea;

import java.util.List;

import user.UserInformation;

public class Judge {
	public     UserInformation   judge(List<UserInformation>  userlList  ,String SessionId){
		//如果list集合不为空,则进行遍历	
		if(userlList!=null){
		for(UserInformation user  :  userlList){		
			if(user.getSessionId().equals(SessionId)){
				return  user;
			}	
		}
	}  
		return null;
	}	
}


最后为显示页面,显示连接的客服端数量以及信息,核心代码如下:

 <body>
            <h1>统计当前的用户数目并输出客服端的详细信息</h1>
            用户的数目为:<%=request.getServletContext().getAttribute("number")%><br>
            ${username}
            <%
            //for循环打印用户的信息
            
                List<UserInformation>  userlist=( List<UserInformation>)request.getSession().getServletContext().getAttribute("userlist");
                
                if(userlist!=null){
                
            for(UserInformation user:userlist){
            %>
    
            ip地址为:<%=user.getIp() %><br>
            SessionId为:<%=user.getSessionId() %><br>
            用户连接的时间为:<%=user.getDate() %><br>
            
            <%} }%> 
            
            
  </body>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值