将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 方左右),或者当你想在任意数量的类上使用“标记接口”时,这特别有用,这样您可以在一个中央位置完成聆听工作。HttpSessionActiveUserActiveUserHttpSessionBindingListener
@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());
}
}
}
这是一个真实的用例: