50 votes

Comment puis-je obtenir une liste de tous les HttpSession objets dans une application web?

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:

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.

46voto

BalusC Points 498232

Non, la Servlet API n'offre pas un moyen. Vous avez vraiment de se saisir de tous, avec l'aide d'un HttpSessionListener. Vous pouvez trouver plusieurs exemples dans les réponses suivantes:

9voto

gertas Points 7113

Il n'est pas simple. Il dépend de déploiement. Ci-dessus échoue une fois que vous décidez d'introduire le déploiement distribué et l'équilibrage de la charge.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X