Disons que j'ai l'exécution d'un application web Java avec 0 ou plus valide HttpSession
des objets associés. Je veux un moyen d'accéder à la liste en cours de validité HttpSession
objets. Je pensais que je pouvais mettre en œuvre un HttpSessionListener
et l'utiliser pour ajouter à une liste de valeurs d'id de session sont stockées dans une application dont l'étendue est un attribut, mais là je suis sur le crochet pour mettre à jour la liste des sessions sont invalidés et qui sait quoi d'autre.
Avant de commencer la cuisson de ma propre solution, j'ai pensé que je devrais poser la question:
La servlet API de fournir des moyens d'accéder à la liste complète des non-invalidé les objets de session?
J'utilise Tomcat 6.x comme mon conteneur d'applications web, et la MyFaces 1.2.x (JSF) de la bibliothèque.
SOLUTION
J'ai suivi une approche similaire à ce que BalusC discuté de ces questions:
- Comment facilement mettre en œuvre "qui est en ligne" en Grain ou d'Applications Java ?
- JSF:, Comment annuler un session de l'utilisateur lorsqu'il se connecte deux fois avec les mêmes informations d'identification
J'ai modifié en SessionData
classe pour implémenter HttpSessionBindingListener
. Lorsqu'une liaison événement se produit, l'objet, soit d'ajouter ou de supprimer de l'ensemble de tous les SessionData
objets.
@Override
public void valueBound(HttpSessionBindingEvent event) {
// Get my custom application-scoped attribute
ApplicationData applicationData = getApplicationData();
// Get the set of all SessionData objects and add myself to it
Set<SessionData> activeSessions = applicationData.getActiveSessions();
if (!activeSessions.contains(this)) {
activeSessions.add(this);
}
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
HttpSession session = event.getSession();
ApplicationData applicationData = getApplicationData();
Set<SessionData> activeSessions = applicationData.getActiveSessions();
if (activeSessions.contains(this)) {
activeSessions.remove(this);
}
}
La seule chose qui continue à m'irriter est ce qui arrive quand Tomcat est redémarré. À moins que Tomcat a été correctement configuré pour ne PAS sérialiser des sessions sur le disque, il le fera. Lorsque Tomcat démarre une fois de plus, l' HttpSession
objets (et l' SessionData
objets avec eux) sont désérialisé et les séances sont faites à nouveau valides. Cependant, la sérialisation/désérialisation totalement de côté l' HttpSession
écouteur d'événements, de sorte que je n'ai pas l'occasion d'gracieusement mis le désérialisé référence à l' SessionData
de retour dans mon gérés Ensemble d'objets après le redémarrage.
Je n'ai pas de contrôle sur la production de configuration de Tomcat dans mon organisation du client, donc je ne peut pas supposer qu'il sera fait de la façon dont je l'attends.
Ma solution est de comparer l' HttpSession
temps de création avec le démarrage de l'application moment où une demande est reçue. Si la session a été créée avant le démarrage de l'application en temps, puis j'appelle invalidate()
et l'utilisateur est envoyé à une erreur/d'avertissement page avec une explication de ce qui s'est passé.
Je obtenir le temps de démarrage de l'application par la mise en œuvre d'un ServletContextListener
et de stocker l'heure actuelle à l'intérieur d'une application étendue de l'objet à partir de l'intérieur de l' contextInitialized()
méthode de mon auditeur.