當 JavaBean 需感知自身被放入/移出 Session、或被鈍化/活化時,實現對應監聽器接口即可,無需在 web.xml 配置,容器自動回調。
感知綁定/解除綁定:
public class UserBean implements HttpSessionBindingListener {
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("對象被放入 Session: " + event.getName());
}
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("對象從 Session 移除: " + event.getName());
}
}
用法:session.setAttribute("user", new UserBean()) 觸發 valueBound;session.removeAttribute("user") 或 Session 失效觸發 valueUnbound。
感知鈍化/活化(Session 持久化到磁盤/從磁盤恢復):
public class UserBean implements HttpSessionActivationListener {
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println("對象即將被鈍化(寫入磁盤)");
}
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println("對象已被活化(從磁盤讀取)");
}
}
在 META-INF/context.xml 配置 PersistentManager + FileStore:
<Context>
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="it315"/>
</Manager>
</Context>
maxIdleSwap="1":空閒 1 秒即觸發鈍化(測試用,生產環境調大)。directory:鈍化文件存放目錄。| 特性 | HttpSessionBindingListener | HttpSessionActivationListener |
|---|---|---|
| 觸發時機 | 綁定/解除綁定 Session | 鈍化/活化(持久化) |
| 實現者 | JavaBean 自身 | JavaBean 自身 |
| 需 web.xml 配置 | 否 | 否 |
| 典型用途 | 在線用戶計數、資源釋放 | 集群 Session 同步、重啟恢復 |
善用這兩個接口,讓領域對象擁有「自我感知」能力,代碼更內聚、架構更乾淨。