Java: Pourquoi la session http n'est pas détruite quand l'onglet ou le navigateur est fermé?
J'ai la suite de la mise en œuvre de HttpSessionlistener
public class SessionListener implements HttpSessionAttributeListener, HttpSessionListener {
public void attributeAdded(HttpSessionBindingEvent event) {
...
}
public void attributeRemoved(HttpSessionBindingEvent event) {
...
}
public void attributeReplaced(HttpSessionBindingEvent event) {
}
//HttpSesion creation & destruction
public void sessionCreated(HttpSessionEvent event) {
HttpSession session = event.getSession();
//log created time
}
public void sessionDestroyed(HttpSessionEvent event) {
HttpSession session = event.getSession();
long destroyedTime = System.currentTimeMillis();
//log destroyed time
}
}
En fait je le connecter à la session de la création et de la destruction du temps.
Mais si la session est longue (par défaut à 30 minutes), et que l'utilisateur ferme le navigateur pendant ce temps, le
sessionDestroyed
n'est pas appelé ?
Pourquoi est-ce ?
Est-il une solution pour ouvrir une session exactement la lorsque la session a été détruit (lorsque l'utilisateur ferme le navigateur)? Ne doivent pas être cet être le navigateur du problème, pour tuer la session quand il est fermé ?
Est-il de l'interface que j'ai à mettre en œuvre pour que cela fonctionne ?
Merci !
source d'informationauteur Flueras Bogdan
Vous devez vous connecter pour publier un commentaire.
Comment savoir au serveur lorsque le navigateur est fermé ou l'onglet fermé? Au point que le navigateur ne peut pas envoyer quoi que ce soit sur le serveur.
C'est une partie fondamentale de HTTP - c'est une demande/réponse de protocole, pas un "ouvert en permanence conversation" où vous pouvez dire si une partie des feuilles de la conversation. Pensez-y comme une série de télégrammes plutôt qu'un coup de téléphone et vous ne pouvez pas dire quand vous avez reçu le dernier télégramme que vous allez obtenir.
Vous aurez besoin de concevoir votre chemin autour de cela - pour éviter besoin pour savoir quand le navigateur est fermé. Il y a des moches, des hacks pour le contourner la prise AJAX interroger le serveur avec un message de pulsation, par exemple - mais l'évolution de la conception est une meilleure solution.
REMARQUE: Comme jwenting commenté ci-dessous, ce qu'il n'est pas sûr à 100%. Si l'événement onunload ne pas obtenir déclenchée par un événement de clôture de l'onglet du navigateur ou de la fenêtre, alors ce serait un échec.
J'ai eu le même problème et le résoudre à l'aide d'un intrusif d'événements JavaScript:
Permettez-moi de vous expliquer brièvement, disons que vous avez une fonction JavaScript qui post, à l'aide de jQuery, l'ID de Session en cours pour que le Servlet de l'invalider, comme ceci:
Pour appeler cette fonction, il vous suffit de le lier comme celles-ci:
Maintenant, safeexit méthode sera appelée lorsque l'ONGLET ou la FENÊTRE du NAVIGATEUR se ferme (ou une redirection).
Avec beaucoup de travail le navigateur ne prend pas en informe le serveur que la fenêtre est fermée, donc Java ne peut pas savoir quand pour détruire la session. D'où le temps est en place et est le premier du serveur sait que cette session peuvent être destructrices.
Vous pourrait essayer de jouer à un appel ajax sur les événements javascript document.onunload
https://developer.mozilla.org/en/DOM/window.onunload mais vous aurez besoin pour être sûr que l'utilisateur n'est pas toujours à l'intérieur de votre site lorsque vous faites cela.
Objets Session live dans le serveur et sont contrôlés par le serveur. Seul le serveur peut créer ou détruire les sessions. Ainsi, si le client est fermé la session de vie jusqu'à ce qu'il expire. Le client peut seulement suggérer au serveur qu'il peut détruire une partie de la session. Cette demande doit être explicite en quelque sorte. Par conséquent, lorsque vous fermez une fenêtre de navigateur, il n'y a pas de demande implicite pour le serveur informant qu'il doit détruire une session donnée.
Si vous avez besoin de la session à être détruits lors d'un navigateur de la fenêtre/onglet est fermé, vous pouvez joindre un JavaScript gestionnaire à l'événement onunload qui fait une sorte d'appel AJAX à une ressource qui appellent à tuer la session.
Noter que l'événement onunload n'est pas toujours du feu de sorte qu'il n'est pas totalement digne de confiance. Un fidèle peut-être d'utiliser un "battement de cœur" du système.
Comme Eric l'a mentionné l'événement unload sur le navigateur peut appeler une fonction javascript, qui à son tour permet d'accéder à une url via une servlet qui vous déconnecte. Vous n'avez pas besoin d'attendre la réponse réelle à partir de la servlet.
Le navigateur web interagit avec le serveur via le protocole http et qui est apatride.
il y a quelques hacks sait
code suivant pour détruire la session lorsque l'utilisateur ferme le navigateur
vous pouvez simplement vérifier si votre session utilisateur , ne sont pas nulles comme :