首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> JSP 程式設計 >> 關於JSP

Servlet 中捕獲 Session 事件實作登入日誌與線上人數統計

     編輯:關於JSP

事件監聽機制

實作 HttpSessionBindingListener 介面的物件被放入/移出 Session 時,容器自動呼叫:

  • valueBound(HttpSessionBindingEvent):綁定時(登入、放入屬性)
  • valueUnbound(HttpSessionBindingEvent):解除綁定時(登出、移除屬性、Session 逾時)

應用場景

  1. 記錄用戶登入/登出時間、IP 等審計日誌。
  2. 統計當前線上人數:利用 ServletContext 全域屬性保存計數器實例,valueBound +1、valueUnbound -1。

完整監聽器範例

public class SessionListener implements HttpSessionBindingListener {
    private String userInfo;
    private static int onlineCount = 0;  // 線上計數器

    public SessionListener(String info) { this.userInfo = info; }

    public void valueBound(HttpSessionBindingEvent event) {
        onlineCount++;
        if (!"count".equals(userInfo)) {  // 非計數器本身才寫日誌
            logEvent("LOGIN", userInfo);
        }
    }

    public void valueUnbound(HttpSessionBindingEvent event) {
        onlineCount--;
        if (!"count".equals(userInfo)) {
            logEvent("LOGOUT", userInfo);
        }
    }

    private void logEvent(String action, String info) {
        // 寫入檔案、資料庫等,略
        System.out.println(action + ": " + info + " TIME: " + new java.util.Date());
    }

    public static int getOnlineCount() { return onlineCount; }
}

整合要點

  • 登入時:session.setAttribute("user", new SessionListener(username)) 觸發 valueBound。
  • 登出/逾時:容器自動呼叫 valueUnbound,無需額外程式碼。
  • 計數器物件存放於 ServletContext 確保全域唯一,避免重複建立。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved