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

HttpSessionListener 實現 Session 過期自動清理資料庫在線用戶

     編輯:Java 相關知識

Web 應用需在用戶 Session 失效 (超時/瀏覽器關閉) 時同步清理資料庫「在線用戶表」。標準解法:實作 HttpSessionListener + web.xml 註冊。

1. 監聽器實作

public class SessionCleanupListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) { /* 可選:上線記錄 */ }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        HttpSession session = se.getSession();
        String sessionId = session.getId();
        String username = (String) session.getAttribute("webusername"); // 登入時存入

        if (username != null && !username.isEmpty()) {
            synchronized (this) { // 防併發重複刪除
                // 1. 清理記憶體快取 (如靜態 Map)
                OnlineUserMap.remove(username);
                // 2. 清理資料庫
                String sql = "DELETE FROM basic_users_online WHERE user_code = ?";
                DBUtils.executeUpdate(sql, username); // 參數化防注入
            }
            System.err.println("用戶離線清理: " + username);
        }
    }
}

2. web.xml 註冊與超時配置

<listener>
    <listener-class>com.yourpkg.SessionCleanupListener</listener-class>
</listener>

<session-config>
    <session-timeout>30</session-timeout> <!-- 分鐘 -->
</session-config>

關鍵注意點

  • sessionDestroyed 在 Session **真正銷毀** 時觸發 (非調用 invalidate() 即刻),容器背景執行緒定期掃描過期 Session。
  • 監聽器中 **無 ServletContext/Request 上下文**,需自行持有 DataSource 或工具類。
  • 資料庫操作建議用**連線池** + **參數化 SQL**,避免長連線洩漏與注入。
  • 分散式集群環境:需共享 Session (如 Sticky Session / Redis Session) 並確保監聽器只在持有 Session 的節點執行,否則重複刪除。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved