Practical Usage of HttpSessionBindingListener And HttpSessionAttributeListener

后端 未结 1 1112
粉色の甜心
粉色の甜心 2021-01-30 04:13

I am reading through head first JSP and servlets. Going through different type of listeners, I came across HttpSessionBindingListener and HttpSessionAttribute

相关标签:
1条回答
  • 2021-01-30 04:40

    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
    0 讨论(0)
提交回复
热议问题