Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Practical Usage of HttpSessionBindingListener And HttpSessionAttributeListener

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.

like image 434
benz Avatar asked Jul 21 '13 20:07

benz


People also ask

What is HttpSessionAttributeListener?

All Superinterfaces: java.util.EventListener public interface HttpSessionAttributeListener extends java.util.EventListener. Interface for receiving notification events about HttpSession attribute changes.

What is HttpSessionBindingListener?

Interface HttpSessionBindingListenerCauses an object to be notified when it is bound to or unbound from a session. The object is notified by an HttpSessionBindingEvent object.

Which listeners is used to track session attribute?

HttpSessionAttributeListener is used to listen to all global attributes changes, whereas HttpSessionBindingListener (last example) is used to listen to a particular attribute. Also HttpSessionBindingListener has to be implemented by the attribute value class itself.


1 Answers

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
like image 175
BalusC Avatar answered Nov 10 '22 19:11

BalusC