如果需要对象X在被纳入session、移出session时分别执行某些任务的话:仅需使X继承
HttpSessionBindingListener接口,然后将X纳入session即可( session.setAttribute("abc", X) );
原理如下:
在tomcat5.5下,HttpSession的实现类位于 tomcat5.5/server/lib/catalina.jar中,以下是部分源码:
public class StandardSession implements HttpSession, Session, Serializable {
……
public void setAttribute(String name, Object value) {
……
if (value instanceof HttpSessionBindingListener) {
Object oldValue = attributes.get(name);
...
if (value != oldValue) {
event = new HttpSessionBindingEvent(getSession(), name, value);
try {
((HttpSessionBindingListener) value).valueBound(event);
} catch (Throwable t) {
...
}
}
}
}
}
以下是对源码的分析结果:
设HttpSessionBindingListener接口有实例lis, 当调用session.setAttribute("abc", lis)时,将
执行:lis.valueBound(HttpSessionBindingEvent)。此后,lis.valueUnbound方法将被以下任一条件触发:
a. 执行session.setAttribute("abc", 非lis对象) 时。
b. 执行session.removeAttribute("abc") 时。
c. 执行session.invalidate()时。
d. session超时后。
HttpSessionBindingListener的原理 / J2EE
最新推荐文章于 2022-07-30 14:22:11 发布