實作 HttpSessionBindingListener,物件綁定/解除綁定 Session 時自動觸發:
valueBound():寫入登入日誌 (INSERT)。valueUnbound():更新登出時間 (UPDATE)。public class User implements HttpSessionBindingListener {
private String userId, loginDatetime;
// ... getter/setter 略 ...
public void valueBound(HttpSessionBindingEvent event) {
Connection conn = null;
try {
conn = DBConnection.getConnection();
PreparedStatement ps = conn.prepareStatement(
"insert into T_LOGIN_LOG(ID, USER_ID, DT_LOGIN) values(SEQ_LOGIN_LOG_ID.NEXTVAL,?,?)");
loginDatetime = getCurrDatetimeStr(); // yyyyMMddHHmmss
ps.setString(1, userId);
ps.setString(2, loginDatetime);
ps.executeUpdate();
} catch (SQLException e) { throw new RuntimeException("登入日誌寫入失敗", e); }
finally { closeQuietly(conn); }
}
public void valueUnbound(HttpSessionBindingEvent event) {
Connection conn = null;
try {
conn = DBConnection.getConnection();
PreparedStatement ps = conn.prepareStatement(
"update T_LOGIN_LOG set DT_LOGOUT=? where USER_ID=? and DT_LOGIN=?");
ps.setString(1, getCurrDatetimeStr());
ps.setString(2, userId);
ps.setString(3, loginDatetime);
ps.executeUpdate();
} catch (SQLException e) { throw new RuntimeException("登出日誌寫入失敗", e); }
finally { closeQuietly(conn); }
}
private static String getCurrDatetimeStr() {
return new java.text.SimpleDateFormat("yyyyMMddHHmmss").format(new java.util.Date());
}
}
login.jsp 送表單 → switch.jsp 驗證通過。switch.jsp 執行 session.setAttribute("ses_userBean", userBean) → 觸發 valueBound() 寫入登入記錄。welcome.jsp。quit.jsp 呼叫 session.invalidate() → 觸發 valueUnbound() 更新登出時間。| 介面 | 事件 |
|---|---|
| ServletContextListener | Web 應用啟動/銷毀 |
| HttpSessionListener | Session 建立/銷毀 |
| ServletRequestListener | Request 建立/銷毀 (J2EE 1.4+) |