java实现在线人数监控

package com.inesa.water.affairs.water.se;
import java.util.ArrayList;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * 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);
  }
}
package com.inesa.water.affairs.water.se;
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;

 
/**
 * 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.inesa.water.affairs.water.se;

import java.util.ArrayList;

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;
    }
}
package com.inesa.water.affairs.water.se;

/**
 * 用户实体类
 *
 */
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;
    }
}

最终需要在启动类添加注解:@ServletComponentScan

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值