2009-12-22 5 views
2

Je suis nouveau sur JSP. J'ai utilisé le code suivant dans une classe qui implémente HttpSessionListener pour obtenir SESSION lorsque la session arrive à expiration:Comment appeler sessionDestroyed lorsqu'une session expire

public void sessionCreated(HttpSessionEvent arg0) { 
     System.out.print("SESSION Created"); 
    } 

    public void sessionDestroyed(HttpSessionEvent arg0) { 
     System.out.print("SESSION OUT"); 
    } 

et je mets en web.xml:

<session-config> 
    <session-timeout>1</session-timeout> 
    </session-config> 

Le servlet attend plus de deux minutes, puis il appelle sessionDestroyed.

Y a-t-il un moyen de forcer sessionDestroyed à expiration du délai?

Merci d'avance.

Répondre

2

Qu'est-ce qui vous fait penser que sessionDestroyed est et non appelé lorsque la session expire? Ou en d'autres termes, quelle est votre interprétation du fait que ça s'appelle?

La servlet gérera la validité des sessions à sa manière, y compris les délais d'expiration des sessions, et lorsqu'elle déterminera que la session n'est plus valide, elle appellera votre méthode. Cependant, je ne pense pas que les servlets garantissent une actualité particulière à cet égard; Je crois comprendre que c'est un peu comme la collecte des ordures dans la mesure où elle est garantie à un certain point, mais pas nécessairement le plus tôt possible que la session devient éligible à la destruction. En tout cas, il semble presque certain que la servlet fait ce que vous voulez - vu que la session est expirée et appelle la méthode appropriée - la seule question est de savoir si vous allez voir cela exactement 60 secondes après la dernière requête ou un peu plus tard. Je suggérerais qu'en général vous ne devriez pas compter sur les timings exacts de quand cette méthode est appelée; Utilisez-le pour effacer les ressources, bien sûr, mais pas pour quelque chose comme l'exactitude du programme (vous obtiendrez IllegalStateExceptions si vous appelez des méthodes sur une session non valide de toute façon). Si vous pensez que vous devez vraiment compter sur cela, peut-être expliquer ce que vous faites pour que d'autres puissent suggérer des moyens plus appropriés pour y parvenir.

1

Je ne pense pas que la spécification J2EE apporte une garantie sur le moment où les méthodes sur l'auditeur seront appelées. Il indique simplement qu'ils seront appelés à un moment donné.

J'ai vu du code qui fonctionnait sur un conteneur (Tomcat) mais qui ne fonctionnait pas sur un autre conteneur (OC4J). Les développeurs ont fait une hypothèse invalide sur le moment où la méthode sessionDestroyed sera appelée.

MISE À JOUR

Notez que le comportement de cette interface a changé en v2.4 de la spécification de servlet. Voir page 21 pour plus de détails.

1

Lorsque vous forcez l'utilisateur à se déconnecter via la méthode invalidate(), la méthode HttpSessionListener sessionDestroyed() est appelée deux fois, une fois lors de la déconnexion et une seconde fois après un certain délai. Cela se produit si, après la déconnexion, vous redirigez l'utilisateur vers une page Web dans votre application. Ce que vous faites essentiellement est de démarrer une autre session (qui peut ne pas être immédiatement évidente si vous n'avez pas ajouté d'exigences de sécurité/authentification à toutes vos pages Web), et le second appel retardé de la méthode sessionDestroyed() est un timeout. La solution simple, à la déconnexion rediriger l'utilisateur vers une page Web en dehors de votre application.Lire cet article session

1

La servlet attend plus de deux minutes, puis appelle sessionDestroyed.

Y a-t-il un moyen de forcer sessionDestroyed lors de l'expiration du délai?

Ceci est spécifique à l'implémentation (dépend du serveur d'application). Il existe un thread d'arrière-plan qui vérifie les sessions à intervalles réguliers et récupère toutes celles qui ont expiré. Cela peut se produire toutes les minutes mais peut également être toutes les 15 minutes. Ils seront également récoltés immédiatement si vous lancez une requête alors que la session associée a déjà expiré mais n'a pas encore été récoltée. Ainsi, si par exemple vous attendez une minute et lancez une nouvelle requête, elle sera immédiatement récoltée. Il n'y a vraiment pas besoin de s'inquiéter à ce sujet. Vous n'avez pas besoin de le forcer à les récolter immédiatement, cela aurait été une tâche coûteuse. Vous savez, tout n'est qu'une question de programmation, pas de magie;)

+0

Je n'arrive pas à comprendre quel est le but de conception de cette interface, à l'exception de libérer la ressource occupée par la session en cours de destruction. Ce que j'essaie de dire, c'est qu'il n'est pas nécessaire de le faire arriver à un point précis (par exemple le 'timeout ') pour ce but de conception. C'est juste mon point. Je ne sais pas si c'est juste. Merci. –

Questions connexes