HttpSessionBindingListener和HttpSessionAttributeListener的实际用法

ben*_*enz 34 session servlets listener

我正在阅读第一个JSP和servlet.通过不同类型的听众去,我碰到HttpSessionBindingListenerHttpSessionAttributeListener.

我在考虑两者之间的区别 - 我希望看到这两位听众在现实世界中的实际用法.我测试HttpSessionBindingListener的实施valueBound()valueUnBound()-为什么会一个对象需要知道它是否已被添加或不呢?

我对实际用法感到很困惑.请帮助澄清一下.

Bal*_*usC 47

HttpSessionBindingListener是要在其实例可以被存储在会话中,如已登录用户的类中实现.

例如

public class ActiveUser implements HttpSessionBindingListener {

    @Override
    public void valueBound(HttpSessionBindingEvent event) {
        logins.add(this);
    }

    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
        logins.remove(this);
    }

}
Run Code Online (Sandbox Code Playgroud)

当此实例ActiveUser被设置为会话属性时HttpSession#setAttribute(),valueBound()将调用该实例.当它被一个HttpSession#removeAttribute()或者一个会话无效删除,或者被另一个会话取代时HttpSession#setAttribute(),那么valueUnbound()将调用它.

以下是一些真实世界的用例:

HttpSessionAttributeListener是被实现为广泛的应用@WebListener时被调用任何属性被添加,移除或在替换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());
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

这是一个真实世界的用例: