Java实现统计在线人数功能的方法详解

2022-09-03 15:35:34 65 0
魁首哥

目录

  • 1. 监听器的简介
  • 2. Java监听器的类型
    • (1)ServletContextListener
    • (2)HttpSessionListener
    • (3)ServletRequestListener
    • (4)ServletContextAttributeListener
    • (5)HttpSessionAttributeListener
    • (6)ServletRequestAttributeListener
    • (7)HttpSessionActivationListener
  • 3.监听器Listener实现统计人数功能
    • 4.Redis实现统计人数功能

      1. 监听器的简介

      监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。

      Java实现统计在线人数功能的方法详解

      2. Java监听器的类型

      (1)ServletContextListenerjs

      用于监听WEB,应用启动和销毁的事件

      public void contextInitialized(ServletContextEvent sce):在初始化web应用时执行

      public void contextDestroyed(ServletContextEvent sce) {}:在销毁web应用时执行

      (2)HttpSessionListener

      用于监听Session对象的创建和销毁

      public void sessionCreated(HttpSessionEvent se) {}:session创建的时候执行

      public void sessionDestroyed(HttpSessionEvent se) {}: session被销毁的时候执行

      (3)ServletRequestListener

      用于监听Requset对象的创建和销毁

      public void requsetCreated(HttpSessionEvent se) {}:requset创建的时候执行

      public void requestDestroyed(HttpSessionEvent se) {}: requset被销毁的时候执行

      (4)ServletContextAttributeListener

      用于监听WEB作用域属性的改动,包括:增加属性、删除属性、修改属性

      attributeAdded(ServletContextEvent sce):向ServletContext中添加属性时执行

      attributeAdded(ServletContextRemoved sce):ServletContext中删除属性时执行

      attributeReplaced(ServletContextRemoved sce):ServletContext中修改属性时执行

      (5)HttpSessionAttributeListener

      用于监听Session作用域属性的改动,包括:增加属性、删除属性、修改属性

      (6)ServletRequestAttributeListener

      用于监听Requset作用域属性的改动,包括:增加属性、删除属性、修改属性

      (7)HttpSessionActivationListener

      用于监听某个对象在Session中的序列化和反序列化

      3.监听器Listener实现统计人数功能

      (1)先创建监听器包listener在新建OnlineListener类

      package listener;
      import javax.servlet.ServletContext;
      import javax.servlet.ServletContextEvent;
      import javax.servlet.ServletContextListener;
      import javax.servlet.annotation.WebListener;
      import javax.servlet.http.HttpSessionAttributeListener;
      import javax.servlet.http.HttpSessionEvent;
      import javax.servlet.http.HttpSessionListener;
      import javax.servlet.http.HttpSessionBindingEvent;
      
      @WebListener()
      public class OnlineListener implements ServletContextListener,HttpSessionListener, HttpSessionAttributeListener {
      
        private static int count=0;
      
        public OnlineListener() {//构造函数
        }
      
        // Ser编程vletContextListener的实现方法,在初始化web应用时执行,你可以在此处初始化server上下恰卡编程网文相关数据
        public void contextInitialized(Servlwww.cppcns.cometContextEvent sce) {//应用初始化完成
       
        }
       
        // ServletContextListener的实现方法,在web应用关闭时执行
        public void contextDestroyed(ServletContextEvent sce) {
        
        }
      
        // HttpSessionListener的实现方法,session被创建的时候执行
        public void sessionCreated(HttpSessionEvent se) {//创建
          count++;
          ServletContext app = se.getSession().getServletContext();
          app.setAttribute("count",count);
        }
      
      
       // HttpSessionListener的实现方法,session被销毁的时候执行
        public void sessionDestroyed(HttpSessionEvent se) {
          count--;
          ServletContext app = se.getSession().getServletContext();
          app.setAttribute("count",count);
        }
      }

      (2)创建监听器servlet的接口

      import javax.servlet.ServletContext;
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      import java.io.PrintWriter;
      
      @WebServlet(name = "OnlineServlet",urlPatterns = "/onlhttp://www.cppcns.comine")
      public class OnlineServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
        }
      
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         String op=request.getParameter("op");
         String result="";
         switch (op){
           case "login":
             //request.getSession()触发监听器的sessionCreated
             ServletContext app=request.getSession().getServletContext();
             int count= (int) app.getAttribute("count");
             result=String.format("当前%d人在线",count);
             break;
           case "logout":
             //销毁session,触发监听器的sessionDestroy
             request.getSession().invalidate();//销毁session
             result="您已经退出了!";
         }
          response.setContentType("text/html;charset=utf-8");
          PrintWriter out=response.getWriter();
          out.write(result);
          out.close();
        }
      }

      4.Redis实现统计人数功能

      需求:平均访问时常,平均同时在线人数,最高同时在线人数

      (1)先设计数据表:

      开始访问页面时间,离开页面时间表:(id,place,ip,user_id,user_name, begin_time, end_time, env, info,len_min)

      统计表:平均访问时常,平均同时在线人数,最高同时在线人数(id,day,age_len_visit_min, acu, pcu)

      统计记录表:每分钟的同时在线人数。 (id,min_time, num)

      (2)使用redis存储当前在线用户,每次调用可以看作浏览了一分钟(根据业务可以再细化,只需要定时任务记录上次一分钟和当前一分钟的用户,即可算出,某一个用户在某个页面的访问时常。

      (3)同时记录用户开始访问页面时间,离开页面时间,即可分析出后续。

      (4)为方便数据处理,可以记录每个页面每分钟的访问量。

      (5)redis, 存储2个hash:

      begin,定时器存储到的hash集合,记录详细信息

      now,接口传递过来的用户访问集合,记录刷新时间

      通过定时器来进行更新,刷新操作。

      ps: hash中单独的key不可以自动设置过期,或者使用redis监听,使用String类型的key,监听是过滤,匹配到自己需要处理的再进行处理即可。

      以上就是Java实现统计在线人数功能的方法详解的详细内容,更多关于Java统计在线人数的资料请关注我们其它相关文章!

      收藏
      分享
      海报
      0 条评论
      65
      上一篇:Java项目工程代码深度刨析总结 下一篇:java高并发InterruptedException异常引发思考

      本站已关闭游客评论,请登录或者注册后再评论吧~

      忘记密码?

      图形验证码