溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java如何實現(xiàn)統(tǒng)計在線人數(shù)功能

發(fā)布時間:2022-08-31 10:53:45 來源:億速云 閱讀:242 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了Java如何實現(xiàn)統(tǒng)計在線人數(shù)功能的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Java如何實現(xiàn)統(tǒng)計在線人數(shù)功能文章都會有所收獲,下面我們一起來看看吧。

    1. 監(jiān)聽器的簡介

    監(jiān)聽器就是一個實現(xiàn)特定接口的普通java程序,這個程序?qū)iT用于監(jiān)聽另一個java對象的方法調(diào)用或?qū)傩愿淖?,?dāng)被監(jiān)聽對象發(fā)生上述事件后,監(jiān)聽器某個方法將立即被執(zhí)行。

    2. Java監(jiān)聽器的類型

    (1)ServletContextListener

    用于監(jiān)聽WEB,應(yīng)用啟動和銷毀的事件

    public void contextInitialized(ServletContextEvent sce):在初始化web應(yīng)用時執(zhí)行

     public void contextDestroyed(ServletContextEvent sce) {}:在銷毀web應(yīng)用時執(zhí)行

    (2)HttpSessionListener

    用于監(jiān)聽Session對象的創(chuàng)建和銷毀

    public void sessionCreated(HttpSessionEvent se) {}:session創(chuàng)建的時候執(zhí)行

    public void sessionDestroyed(HttpSessionEvent se) {}: session被銷毀的時候執(zhí)行

    (3)ServletRequestListener

    用于監(jiān)聽Requset對象的創(chuàng)建和銷毀

    public void requsetCreated(HttpSessionEvent se) {}:requset創(chuàng)建的時候執(zhí)行

    public void requestDestroyed(HttpSessionEvent se) {}: requset被銷毀的時候執(zhí)行

    (4)ServletContextAttributeListener

    用于監(jiān)聽WEB作用域?qū)傩缘母膭?,包括:增加屬性、刪除屬性、修改屬性

    attributeAdded(ServletContextEvent sce):向ServletContext中添加屬性時執(zhí)行

    attributeAdded(ServletContextRemoved sce):ServletContext中刪除屬性時執(zhí)行

    attributeReplaced(ServletContextRemoved sce):ServletContext中修改屬性時執(zhí)行

    (5)HttpSessionAttributeListener

    用于監(jiān)聽Session作用域?qū)傩缘母膭?,包括:增加屬性、刪除屬性、修改屬性

    (6)ServletRequestAttributeListener

    用于監(jiān)聽Requset作用域?qū)傩缘母膭?,包括:增加屬性、刪除屬性、修改屬性 

    (7)HttpSessionActivationListener

    用于監(jiān)聽某個對象在Session中的序列化和反序列化

    3.監(jiān)聽器Listener實現(xiàn)統(tǒng)計人數(shù)功能 

    (1)先創(chuàng)建監(jiān)聽器包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() {//構(gòu)造函數(shù)
        }
     
        // ServletContextListener的實現(xiàn)方法,在初始化web應(yīng)用時執(zhí)行,你可以在此處初始化server上下文相關(guān)數(shù)據(jù)
        public void contextInitialized(ServletContextEvent sce) {//應(yīng)用初始化完成
       
        }
       
        // ServletContextListener的實現(xiàn)方法,在web應(yīng)用關(guān)閉時執(zhí)行
        public void contextDestroyed(ServletContextEvent sce) {
         
        }
     
        // HttpSessionListener的實現(xiàn)方法,session被創(chuàng)建的時候執(zhí)行
        public void sessionCreated(HttpSessionEvent se) {//創(chuàng)建
            count++;
            ServletContext app = se.getSession().getServletContext();
            app.setAttribute("count",count);
        }
    
    
       // HttpSessionListener的實現(xiàn)方法,session被銷毀的時候執(zhí)行
        public void sessionDestroyed(HttpSessionEvent se) {
            count--;
            ServletContext app = se.getSession().getServletContext();
            app.setAttribute("count",count);
        }
    }

    (2)創(chuàng)建監(jiān)聽器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 = "/online")
    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()觸發(fā)監(jiān)聽器的sessionCreated
                  ServletContext app=request.getSession().getServletContext();
                  int count= (int) app.getAttribute("count");
                  result=String.format("當(dāng)前%d人在線",count);
                  break;
              case "logout":
                  //銷毀session,觸發(fā)監(jiān)聽器的sessionDestroy
                  request.getSession().invalidate();//銷毀session
                  result="您已經(jīng)退出了!";
          }
            response.setContentType("text/html;charset=utf-8");
            PrintWriter out=response.getWriter();
            out.write(result);
            out.close();
        }
    }

    4.Redis實現(xiàn)統(tǒng)計人數(shù)功能 

    需求:平均訪問時常,平均同時在線人數(shù),最高同時在線人數(shù)

    (1)先設(shè)計數(shù)據(jù)表:

    開始訪問頁面時間,離開頁面時間表:(id,place,ip,user_id,user_name, begin_time, end_time, env, info,len_min)

    統(tǒng)計表:平均訪問時常,平均同時在線人數(shù),最高同時在線人數(shù)(id,day,age_len_visit_min, acu, pcu)

    統(tǒng)計記錄表:每分鐘的同時在線人數(shù)。 (id,min_time, num)

    (2)使用redis存儲當(dāng)前在線用戶,每次調(diào)用可以看作瀏覽了一分鐘(根據(jù)業(yè)務(wù)可以再細(xì)化,只需要定時任務(wù)記錄上次一分鐘和當(dāng)前一分鐘的用戶,即可算出,某一個用戶在某個頁面的訪問時常。

    (3)同時記錄用戶開始訪問頁面時間,離開頁面時間,即可分析出后續(xù)。

    (4)為方便數(shù)據(jù)處理,可以記錄每個頁面每分鐘的訪問量。

    (5)redis, 存儲2個hash:

    begin,定時器存儲到的hash集合,記錄詳細(xì)信息

    now,接口傳遞過來的用戶訪問集合,記錄刷新時間

    通過定時器來進行更新,刷新操作。

    ps: hash中單獨的key不可以自動設(shè)置過期,或者使用redis監(jiān)聽,使用String類型的key,監(jiān)聽是過濾,匹配到自己需要處理的再進行處理即可。

    關(guān)于“Java如何實現(xiàn)統(tǒng)計在線人數(shù)功能”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“Java如何實現(xiàn)統(tǒng)計在線人數(shù)功能”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI