Il y a quelques jours, lorsque je travaillais sur un système d'enregistrement, j'ai rencontré un problème de session populaire. Le projet est Spring + SpringMVC + MyBatis Framework, le système de gestion de la gestion de Maven Javaweb. Pour certains numéros de session, l'analyse suivante est effectuée. Ici, nous nous concentrons sur la question du cycle de vie de session. Quant aux autres définitions, nous n'expliquerons pas:
Tout d'abord, expliquons le cycle de vie de la session:
Stockage: la session est stockée du côté du serveur. Généralement, afin d'empêcher qu'il soit stocké dans la mémoire du serveur (pour un accès à grande vitesse), Sessinon est créé lorsque l'utilisateur accède au serveur pour la première fois. Il est nécessaire de noter que la session ne sera créée que lors de l'accès à JSP, servlet et autres programmes. L'accès uniquement à des ressources statiques telles que HTML et Image ne créera pas de session. Dans une application Javaweb, vous pouvez appeler request.getSession (boolean xxx) pour générer une session. Notez que lorsque le paramètre booléen est vrai, une nouvelle session est forcée d'être générée ici.
1. Temps d'expiration de session:
La session expire après la dernière fois que la session a été utilisée atteint le temps de défaillance défini.
2. Une autre méthode session.invalidate () est exécutée, ce qui rend activement la session invalide.
Pour le temps d'invalidation, vous pouvez le définir en configurant les propriétés dans web.xml:
<Session-Config> <session-timeout> Temps d'expiration </Session-Timeout> </ Session-Config>
L'unité de temps de défaillance est de minutes. Si la session est valable pour une journée, elle peut être définie sur 60 * 24. Lorsqu'il est défini sur 0 ou négatif, la session est valable en permanence. Selon la définition du temps d'échec, il est facile de comprendre cette situation.
Pourquoi la session échoue-t-elle après la fermeture du navigateur?
Sur la base de ce qui est connu, un exemple simple a été écrit:
@ControllerPublic Class SessionTest {@RequestMapping ("/ SessionTest") public String SessionTest (HttpServLetRequest Request, HttpServletResponse Response) {System.out.println ("Success!"); HttpSession session = request.getSession (); session.setMaxInactiveInterval (259200); request.setAttribute ("CreationTime", session.getCreationTime ()); // Time de création request.setAttribute ("id", session.getId ()); // id requen deuxième demande.setAttribute ("Lasttime", session.getLastAccessEdTime ()); // Last Utilise Time request.setAttribute ("SessionTest", Session); // System.out.println (Session.getCreationTime ()); // System.out.println (Session.getMaxIncatHed ()); // System.out.println (session.getLastAccessSedTime ()); Renvoie "Page / Showssion"; } <table cellpacing = "0" CellPadding = "0"> <tr> <td> Temps de création: </td> <td> $ {CreationTime} </td> </tr> <tr> <td> id: </td> <td> $ {id} </td> </tr> <tr> <td> survival maximum Temps: </td> <td> $ {max} </td> </tr> <tr> <td> Dernier temps utilisé: </td> <td> $ {Lasttime} </td> </tr> <tr> <td> session: </td> <td> $ {sessionTest} </td> </tr> </ TABLE>Analyse:
On peut voir que le temps d'invalidation de la session est en fait lorsque le navigateur est fermé, donc ce n'est que si le navigateur ne se ferme pas et que vous pouvez accéder à nouveau à utiliser l'état de connexion. Que représente le temps d'invalidation ci-dessus?
Une session a été créée entre le navigateur et le serveur. Étant donné que le client n'a pas interagi avec le serveur pendant longtemps (temps d'hibernation), le serveur a détruit cette session. La session précédente lorsque le client interagissait avec le serveur n'existait pas. Ma compréhension est que le temps d'invalidation ne prend effet que lors d'une session. Si le navigateur est fermé et que la session se termine, le temps d'invalidation est défini en permanence, ce qui est le moment où le navigateur est fermé et la session est fermée. Pour résoudre ce problème, vous pouvez mélanger les cookies avec des sessions. Il y a une manière si stupide:
Ajoutez activement des cookies pour définir le répertoire de sauvegarde et la survie
public static void addcookie (nom de chaîne, valeur de chaîne, int, httpservletResponse réponse) lève unportdencodingException {cookie c = new cookie (nom, urlencoder.encode (valeur, "utf-8")); C.SetMaxage (âge); C.SetPath (Path); réponse.addcookie (c); } Lorsque vous accédez à nouveau, utilisez Cookie[] cookies = request.getCookies(); Pour parcourir les cookies, obtenir le cookie souhaité selon le nom du cookie, ou il peut être considéré comme une session. Enfin, vous obtenez le résultat souhaité, et la session (le cookie nommé JSessionID) s'échappe de l'emprisonnement du navigateur.
Résumer
Ce qui précède est la solution au problème de la défaillance de J2EE-SESSION après la fermeture du navigateur. J'espère que ce sera utile à tout le monde. Si vous avez des questions, veuillez me laisser un message et l'éditeur répondra à tout le monde à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!