session - HttpSessionBindingListener 和 HttpSessionAttributeListener 的实际用法

标签 session servlets listener

我正在通读 JSP 和 servlet。通过不同类型的监听器,我遇到了 HttpSessionBindingListenerHttpSessionAttributeListener

我正在考虑两者之间的区别 - 我想看看这两个听众在现实世界中的实际用法。我通过实现 valueBound()valueUnBound() 测试了 HttpSessionBindingListener - 为什么对象需要知道它是否已添加?

我对实际用途很困惑。请帮助澄清这一点。

最佳答案

HttpSessionBindingListener是在其实例可能存储在 session 中的类上实现的,例如登录的用户。

例如

public class ActiveUser implements HttpSessionBindingListener {

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

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

}

当此 ActiveUser 的实例被 HttpSession#setAttribute() 设置为 session 属性时,valueBound() 将是调用。当它被 HttpSession#removeAttribute() 删除,或者 session 无效,或者被另一个 HttpSession#setAttribute() 替换时,valueUnbound () 将被调用。

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

HttpSessionAttributeListener将作为应用程序范围的 @WebListener 实现,当在 HttpSession 中添加、删除或替换任何属性时,它会被调用。继续上面的 ActiveUser 示例,如果您无法修改 ActiveUser 类来实现 HttpSessionBindingListener(因为它是第 3 方或so),或者当您想在任意数量的类上使用“标记接口(interface)”以便您可以在一个中心位置完成监听工作时。

@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());
        }
    }

}

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

关于session - HttpSessionBindingListener 和 HttpSessionAttributeListener 的实际用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17776704/

相关文章:

python - webpy 中的 session - 获取所有类中的用户名

java - Tomcat - 防止 session 持久化

java - 将监听器分配给类时遇到问题

c# - 如何在这个简单的 asp.net webforms 应用程序中拥有和管理 session 超时?

php - Cron sessionclean 错误 : find: `/proc/xxxxx/fd' : No such file or directory

java - 获取当前动态web项目JAVA的路径

java - org.hibernate.hql.ast.QuerySyntaxException : Employee_detail is not mapped [from Employee_detail]

java - 未调用 Servlet 过滤器

android - 将 OnFocusChangeListener 和 OnItemSelectedListener 应用于 Spinner

Java:EDT、SwingUtilities 和 GUILock