web-dev-qa-db-fra.com

Utilisation pratique de HttpSessionBindingListener et HttpSessionAttributeListener

Je lis par JSP tête première et servlets. En passant par différents types d'auditeurs, je suis tombé sur HttpSessionBindingListener et HttpSessionAttributeListener.

Je pensais à la différence entre les deux - je veux voir les usages pratiques dans des exemples réels de ces deux auditeurs. J'ai testé HttpSessionBindingListener en implémentant valueBound() et valueUnBound() - pourquoi un objet aurait-il besoin de savoir s'il a été ajouté ou non?

Je suis assez confus quant aux usages pratiques. Veuillez aider à clarifier cela.

35
benz

HttpSessionBindingListener doit être implémenté sur la classe dont les instances peuvent être stockées dans la session, comme l'utilisateur connecté.

Par exemple.

public class ActiveUser implements HttpSessionBindingListener {

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

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

}

Lorsqu'une instance de ce ActiveUser est définie comme attribut de session par HttpSession#setAttribute(), alors le valueBound() sera invoqué. Lorsqu'elle est supprimée par HttpSession#removeAttribute(), ou une invalidation de la session, ou qu'elle est remplacée par une autre HttpSession#setAttribute(), la valueUnbound() sera invoquée.

Voici quelques cas d'utilisation réels:

HttpSessionAttributeListener doit être implémenté comme une application étendue @WebListener Qui sera invoquée lorsque n'importe laquelle est ajouté, supprimé ou remplacé dans le HttpSession. Poursuivant avec l'exemple ActiveUser ci-dessus, cela est particulièrement utile si vous ne pouvez pas modifier la classe ActiveUser pour implémenter HttpSessionBindingListener (car il s'agit d'une tierce partie), ou lorsque vous veulent utiliser une "interface marqueur" sur un nombre arbitraire de classes afin que vous puissiez faire le travail d'écoute en un seul endroit central.

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

}

Voici un cas d'utilisation réel:

47
BalusC