将HttpSessionBindingListener
在其实例可能存储在会话中的类上实现,例如登录用户。
例如
public class ActiveUser implements HttpSessionBindingListener {
@Override
public void valueBound(HttpSessionBindingEvent event) {
logins.add(this);
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
logins.remove(this);
}
}
当 this 的实例ActiveUser
被 设置为会话属性时HttpSession#setAttribute()
,valueBound()
将调用 。当它被 删除HttpSession#removeAttribute()
,或会话无效,或被另一个 替换时HttpSession#setAttribute()
,valueUnbound()
将调用 。
以下是一些真实世界的用例:
将HttpSessionAttributeListener
被实现为应用程序范围,@WebListener
当在. 继续上面的例子,如果你不能修改要实现的类(因为它是第 3 方左右),或者当你想在任意数量的类上使用“标记接口”时,这特别有用,这样您可以在一个中央位置完成聆听工作。HttpSession
ActiveUser
ActiveUser
HttpSessionBindingListener
@WebListener
public class ActiveUserListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent event) {
if (event.getValue() instanceof ActiveUser) {
logins.add(event.getValue());
}
}
@Override
public void attributeRemoved(HttpSessionBindingEvent event) {
if (event.getValue() instanceof ActiveUser) {
logins.remove(event.getValue());
}
}
@Override
public void attributeReplaced(HttpSessionBindingEvent event) {
if (event.getValue() instanceof ActiveUser) {
logins.add(event.getValue());
}
}
}
这是一个真实的用例: