Web 應用需在用戶 Session 失效 (超時/瀏覽器關閉) 時同步清理資料庫「在線用戶表」。標準解法:實作 HttpSessionListener + web.xml 註冊。
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);
}
}
}
<listener>
<listener-class>com.yourpkg.SessionCleanupListener</listener-class>
</listener>
<session-config>
<session-timeout>30</session-timeout> <!-- 分鐘 -->
</session-config>
invalidate() 即刻),容器背景執行緒定期掃描過期 Session。