實作 HttpSessionBindingListener 介面的物件被放入/移出 Session 時,容器自動呼叫:
valueBound(HttpSessionBindingEvent):綁定時(登入、放入屬性)valueUnbound(HttpSessionBindingEvent):解除綁定時(登出、移除屬性、Session 逾時)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 確保全域唯一,避免重複建立。