利用Listener實現網站累積訪問人數、最大同時線上人數、當前登錄用戶數的記錄

来源:http://www.cnblogs.com/liutie/archive/2017/06/25/7076402.html
-Advertisement-
Play Games

1.網站全局統計變數類,只定義全局變數 1 package com.lt.listener; 2 3 import java.util.Date; 4 import java.util.HashMap; 5 import java.util.Map; 6 7 import javax.servlet ...


 1.網站全局統計變數類,只定義全局變數

 1 package com.lt.listener;
 2 
 3 import java.util.Date;
 4 import java.util.HashMap;
 5 import java.util.Map;
 6 
 7 import javax.servlet.http.HttpSession;
 8 /**
 9  * 網站全局變數類
10  * @author LIUTIE
11  *
12  */
13 public abstract class ApplicationConstants {
14     
15     /**
16      * 用戶登錄session名稱
17      */
18     public static final String LOGIN_SESSION_NAME = "userInfo";
19 
20     /**
21      * 索引所有的session  
22      * 用於單一登錄
23      */
24     public static Map<String,HttpSession> SESSION_MAP = new HashMap<>();
25     
26     /**
27      * 當前線上用戶數
28      */
29     public static int CURRENT_LOGIN_COUNT = 0;
30     
31     /**
32      * 歷史訪客總數
33      */
34     public static int TOTAL_HISTORY_COUNT = 0;
35     
36     /**
37      * 最高同時線上人數
38      */
39     public static int MAX_ONLINE_COUNT = 0;
40     
41     /**
42      * 伺服器啟動時間
43      */
44     public static Date SERVER_START_DATE = new Date();
45     
46     /**
47      * 最高線上人數時間
48      */
49     public static Date MAX_ONLINE_COUNT_DATE = new Date();
50     
51     
52     
53 }
View Code

2.實現servletContext監聽,用於記錄伺服器信息

 1 package com.lt.listener;
 2 
 3 import java.util.Date;
 4 
 5 import javax.servlet.ServletContextEvent;
 6 import javax.servlet.ServletContextListener;
 7 
 8 /**
 9  * servletContext監聽
10  * 記錄伺服器信息 啟動關閉時間等
11  * @author LIUTIE
12  *
13  */
14 public class MyContextListener implements ServletContextListener {
15 
16     /**
17      * 伺服器啟動時被調用
18      */
19     @Override
20     public void contextDestroyed(ServletContextEvent arg0) {
21         //記錄啟動時間
22         ApplicationConstants.SERVER_START_DATE = new Date();
23     }
24 
25     /**
26      * 伺服器關閉時被調用
27      */
28     @Override
29     public void contextInitialized(ServletContextEvent arg0) {
30         //保存數據到硬碟
31         // TODO Auto-generated method stub
32     }
33 
34 }
View Code

3.實現 HttpSessionListener, HttpSessionAttributeListener監聽,用於記錄登錄信息、訪問總人數、線上人數,實現單一登錄等

  1 package com.lt.listener;
  2 
  3 import java.util.Date;
  4 
  5 import javax.servlet.http.HttpSession;
  6 import javax.servlet.http.HttpSessionAttributeListener;
  7 import javax.servlet.http.HttpSessionBindingEvent;
  8 import javax.servlet.http.HttpSessionEvent;
  9 import javax.servlet.http.HttpSessionListener;
 10 
 11 /**
 12  * session監聽
 13  * 記錄登錄信息 訪問總人數 線上人數等
 14  * 實現單一登錄
 15  * @author LIUTIE
 16  *
 17  */
 18 public class MySessionListener implements HttpSessionListener, HttpSessionAttributeListener {
 19 
 20     /**
 21      * session創建時被調用
 22      */
 23     @Override
 24     public void sessionCreated(HttpSessionEvent sessionEvent) {
 25         // 獲取創建的session
 26         HttpSession session = sessionEvent.getSession();
 27         // 添加到map
 28         ApplicationConstants.SESSION_MAP.put(session.getId(), session);
 29         // 訪問總人數++
 30         ApplicationConstants.TOTAL_HISTORY_COUNT++;
 31         // 如果map總數大於最高同時線上人數則更新最高線上人數及時間
 32         if (ApplicationConstants.MAX_ONLINE_COUNT < ApplicationConstants.SESSION_MAP.size()) {
 33             ApplicationConstants.MAX_ONLINE_COUNT = ApplicationConstants.SESSION_MAP.size();
 34             ApplicationConstants.MAX_ONLINE_COUNT_DATE = new Date();
 35         }
 36 
 37     }
 38 
 39     /**
 40      * session銷毀時被調用
 41      */
 42     @Override
 43     public void sessionDestroyed(HttpSessionEvent sessionEvent) {
 44         // 獲取即將被銷毀的session
 45         HttpSession session = sessionEvent.getSession();
 46         // 在map中根據key移除
 47         ApplicationConstants.SESSION_MAP.remove(session.getId());
 48     }
 49 
 50     /**
 51      * 添加session屬性時被調用
 52      */
 53     @Override
 54     public void attributeAdded(HttpSessionBindingEvent event) {
 55         // 判斷是否添加的用戶登錄信息session
 56         if (event.getName().equals(ApplicationConstants.LOGIN_SESSION_NAME)) {
 57             // 當前登錄用戶數++
 58             ApplicationConstants.CURRENT_LOGIN_COUNT++;
 59             // 是否在其他機器登錄處理
 60             isLoginInOtherPlace(event);
 61         }
 62     }
 63 
 64     /**
 65      * 移除session屬性時被調用
 66      */
 67     @Override
 68     public void attributeRemoved(HttpSessionBindingEvent event) {
 69         // 判斷是否移除的用戶登錄信息session
 70         if (event.getName().equals(ApplicationConstants.LOGIN_SESSION_NAME)) {
 71             // 當前登錄用戶數--
 72             ApplicationConstants.CURRENT_LOGIN_COUNT--;
 73             // 是否在其他機器登錄處理
 74             isLoginInOtherPlace(event);
 75         }
 76     }
 77 
 78     /**
 79      * 修改session屬性時被調用
 80      */
 81     @Override
 82     public void attributeReplaced(HttpSessionBindingEvent event) {
 83 
 84         // 判斷是否修改的用戶登錄信息session
 85         if (event.getName().equals(ApplicationConstants.LOGIN_SESSION_NAME)) {
 86             // 是否在其他機器登錄處理
 87             isLoginInOtherPlace(event);
 88         }
 89     }
 90 
 91     /**
 92      * 是否在其他機器登錄處理
 93      * 
 94      * @param event
 95      */
 96     private void isLoginInOtherPlace(HttpSessionBindingEvent event) {
 97         // 獲取添加的session
 98         HttpSession session = event.getSession();
 99         // 遍歷查找此用戶是否登錄
100         for (HttpSession s : ApplicationConstants.SESSION_MAP.values()) {
101             // 如果已經在其他機器登錄則使其失效
102             if (event.getValue().equals(s.getAttribute(ApplicationConstants.LOGIN_SESSION_NAME))
103                     && session.getId() != s.getId()) {
104                 // 使session失效
105                 session.invalidate();
106                 break;
107             }
108         }
109     }
110 }
View Code

4.實現 request監聽,用於記錄客戶信息 ip、url等

 1 package com.lt.listener;
 2 
 3 import javax.servlet.ServletRequestEvent;
 4 import javax.servlet.ServletRequestListener;
 5 import javax.servlet.http.HttpServletRequest;
 6 
 7 /**
 8  * request監聽 用於記錄客戶信息 ip、url等
 9  * 
10  * @author LIUTIE
11  *
12  */
13 public class MyRequestListener implements ServletRequestListener {
14 
15     /**
16      * request銷毀時調用
17      */
18     @Override
19     public void requestDestroyed(ServletRequestEvent event) {
20         // TODO Auto-generated method stub
21 
22     }
23 
24     /**
25      * request創建時調用
26      */
27     @Override
28     public void requestInitialized(ServletRequestEvent event) {
29         HttpServletRequest request = (HttpServletRequest) event;
30         // 客戶端ip
31         String ip = request.getRemoteAddr();
32         // 訪問的URL地址
33         String url = request.getRequestURI();
34         // 只做簡單後臺列印
35         System.out.println("The client ip is " + ip);
36         System.out.println("The address url is " + url);
37     }
38 
39 }
View Code

5.在web.xml中配置隊一行的listener

        <listener>
        <listener-class>
            com.lt.listener.MyContextListener
        </listener-class>
    </listener>
    <listener>
        <listener-class>
            com.lt.listener.MySessionListener
        </listener-class>
    </listener>
    <listener>
        <listener-class>
            com.lt.listener.MyRequestListener
        </listener-class>
    </listener>    
View Code

Listener種類:

  1.監聽對象的創建與銷毀的Listener:

  HttpSessionListener: sessionCreated(HttpSessionEvent sessionEvent)、sessionDestroyed(HttpSessionEvent sessionEvent)

  ServletRequestListener: requestInitialized(ServletRequestEvent event)、requestDestroyed(ServletRequestEvent event)

  ServletContextListener: contextInitialized(ServletContextEvent event)、contextDestroyed(ServletContextEvent event)

  2.監聽對象的屬性變化的Listener:

  HttpSessionAttributeListener:(添加、更新、移除session時觸發)

  attributeAdded(HttpSessionBindingEvent event)、attributeReplaced(HttpSessionBindingEvent event)、attributeRemoved(HttpSessionBindingEvent event)

  ServletContextAttributeListener:(添加、更新、移除context時觸發)

    attributeAdded(ServletContextAttributeEvent event)、attributeReplaced(ServletContextAttributeEvent event)、attributeRemoved(ServletContextAttributeEvent event) 

  ServletRequestAttributeListener:(添加、更新、移除request時觸發)

  attributeAdded(ServletRequestAttributeEvent event)、attributeReplaced(ServletRequestAttributeEvent event)、attributeRemoved(ServletRequestAttributeEvent event) 

  3.監聽Session內的對象

  HttpSessionBindingListener:(對象放入session、對象從session移除時觸發)

  valueBound(HttpSessionBindingEvent event)、valueUnbound(HttpSessionBindingEvent event)

  HttpSessionActivationListener:(session中的對象被鈍化、對象被重新載入時觸發ps:將session中的內容保存到硬碟的過程叫做鈍化,鈍化需實現Serializable序列化介面)

  sessionWillPassivate(HttpSessionEvent event)、sessionDidActivate(HttpSessionEvent event)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一 概述 1.Disruptor Disruptor是一個高性能的非同步處理框架,一個“生產者-消費者”模型。 2.RingBuffer RingBuffer是一種環形數據結構,包含一個指向下一個槽點的序號,可以線上程間傳遞數據。 3.Event 在Disruptor框架中,生產者生產的數據叫做Eve ...
  • 接觸的一些演算法,搞不清楚搞得清楚的 列一個,大部分是最近看演算法圖解裡邊的演算法,平常也經常用到,包括 二分查找,選擇排序,快速排序,BFS DFS 動態規劃 ...
  • java.net.InetAddress類:此類表示互聯網協議 (IP) 地址。 靜態方法: static InetAddress getLocalHost() 返回本地主機(你自己的使用的電腦)。 static InetAddress getByName(String host) 在給定主機名的情 ...
  • 問題描述及方案 假設我們在做電商項目,在進行計算時這個丟失精度在產品價格計算就會出現問題,很有可能造成我們手裡有9.99元然後後面會有一堆9,但是呢這些錢無法購買一個10元的商品。 在某些編程語言中有專門處理貨幣的類型,但是Java沒有,不過沒關係我們可以通過 來解決這個問題。 下麵我們來看幾個例子 ...
  • 章節:“5w1h2k”分析法 what:我想知道某個“關鍵詞(keyword)”(即,辭彙、詞語,或稱單詞,可以是概念|專業術語|.......)的定義。 why:我想分析and搞清楚弄明白“事物發生的原因(原理)”。“why”代表的是一種“演繹推理”;我會不會犯“歸因錯誤”?是“單因素”的還是“多 ...
  • 列表解析,主要用於動態創建列表 本篇主要說一下,lambda、map()、和filter()同列表解析語句之間結合的用法 列表解析的基本語法為:[expr for iter_var in iterable] 這個語句的核心是for迴圈,他迭代iterable對象的所有條目。前面的expr應用於序列的 ...
  • 國內源: 阿裡雲 http://mirrors.aliyun.com/pypi/simple/中國科技大學 https://pypi.mirrors.ustc.edu.cn/simple/ 豆瓣(douban) http://pypi.douban.com/simple/ 清華大學 https:// ...
  • 1.首先下載resin: http://www.caucho.com/ 2.下載resin 的eclipse插件: 在eclipse的更新地址填上http://caucho.com/eclipse/ 3.eclipse-》視窗-》首選項-》java-》已安裝的JRE,添加本機的JRE6,而且要加上J ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...