Practical Usage of HttpSessionBindingListener And HttpSessionAttributeListener
listener, servlets, session
Solution
The `HttpSessionBindingListener` is to be implemented on the class whose instances may be stored in the session, such as the logged-in user.
E.g.
public class ActiveUser implements HttpSessionBindingListener {
@Override
public void valueBound(HttpSessionBindingEvent event) {
logins.add(this);
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
logins.remove(this);
}
}
When an instance of this `ActiveUser` get set as a session attribute by `HttpSession#setAttribute()`, then the `valueBound()` will be invoked. When it get removed by either `HttpSession#removeAttribute()`, or an invalidate of the session, or get replaced by another `HttpSession#setAttribute()`, then the `valueUnbound()` will be invoked.
Here are some real world use cases:
- Getting SessionScoped bean from HttpSessionListener?
- How to call a method before the session object is destroyed?
- Call an action when closing a JSP
- implementing HttpSessionListener
- How to access HTTP sessions in Java
The `HttpSessionAttributeListener` is to be implemented as an application wide `@WebListener` which get invoked when any attribute is added, removed or replaced in the `HttpSession`. Continuing with the above `ActiveUser` example, this is particularly useful if you can't modify the `ActiveUser` class to implement `HttpSessionBindingListener` (because it's 3rd party or so), or when you want to make use of a "marker interface" on an arbitrary amount of classes so that you can do the listening job in a single central place.
@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());
}
}
}
Here's a real world use case:
- Getting notification when bounded/unbounded to a HTTP session
Problem
I am reading through head first JSP and servlets. Going through different type of listeners, I came across `HttpSessionBindingListener` and `HttpSessionAttributeListener`. I was thinking about the difference between the two - I want to see the practical usages in real world examples of those two listeners. I tested `HttpSessionBindingListener` by implementing `valueBound()` and `valueUnBound()` - why would an object need to know whether it has been added or not? I am pretty confused about the practical usages. Please help in clarifying this.