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.
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: