Dans cet article, le projet de Springboot utilise l'auditeur HTTPSessionListener (l'un des auditeurs) pour compter le nombre de personnes en ligne, qui est essentiellement pour compter le nombre de sessions.
L'idée est très simple, mais il y a un détail que je n'ai pas géré, donc je l'ai débogué pendant plus d'un jour avant de faire le bug.
Écrivez d'abord un écouteur HTTPSessionListener. Le nombre est le nombre de sessions (nombre de personnes). Lorsque la session est créée, la méthode de session de l'auditeur sera déclenchée. Lorsque la session est détruite, la méthode SessionDestRoyed de l'auditeur sera déclenchée. Après avoir calculé le nombre de personnes dans l'auditeur, mettez-le dans le servletContext (il peut être compris comme un référentiel où n'importe quelle demande peut stocker et obtenir les propriétés à l'intérieur).
Faites attention à l'ajout de @WeBListener à l'auditeur, il n'est donc pas nécessaire de le configurer.
@Weblistener public class OnlineCount implémente httpSessionListener {public int count) Count ++; arg0.getSession (). getServletContext (). setAttribute ("count", count); } @Override public synchronisé void SessionDestRoyed (httpSessionEvent arg0) {// répéter le système de révocation de la session.out.println ("【httpSessionListener écouteur】 count-- réduction"); compter--; arg0.getSession (). getServletContext (). setAttribute ("count", count); }}Ensuite, écrivez un contrôleur qui interroge le nombre de sessions. J'ai commencé avec ce qui suit, ce qui est faux!
Prenez le compte de ServletContext et retournez le compte à l'extrémité frontale.
@RequestMapping ("/ count") @ResponseBody public String Count (httpServletRequest httpServLetRequest, httpservletResponse httpservletResponse) {objet count = httpservletquest.getServletContext (). GetTrut ("count"); Retour "Count:" + Count; }C'est faux. Vous constaterez que la page voit que le nombre est nul car aucune session n'est créée, et il n'y a pas de méthode statistique pour déclencher l'auditeur. Alors changez-le:
@Controller public class indexController {@RequestMapping ("/ count") @ResponseBody Public String Count (httpservletRequest httpservletRequest, httpservletResserponse httpservletRessage) {httpSession session = httpservletRequest.getSession (); Objet count = session.getServletContext (). GetAttribute ("count"); Retour "Count:" + Count; }} HttpSession Session = httpServLetRequest.getSession (); Fonction: Si l'utilisateur n'a pas de session, il créera une session, et s'il y a une session, il ne le créera pas.
Il semble juste de le changer à ce test, mais il y a un problème. Un navigateur correspond à une session. Si vous ouvrez 2 navigateurs, vous verrez que le nombre est 2, ce qui est correct. Mais si vous fermez un navigateur et l'ouvrez, il doit être 2 et restez inchangé, mais il devient 3. La raison en est que la méthode de destruction de session n'est pas exécutée. Lorsque vous rouvrez, le serveur ne peut pas trouver la session d'origine de l'utilisateur et recréer une session. Il y a donc 3 séances, mais il n'y a que 2 navigateurs, ce qui signifie qu'il ne devrait y avoir que 2 personnes en ligne dans la simulation.
Il existe deux façons de résoudre ce problème. L'une consiste à appeler une méthode pour détruire la session lors de la fermeture de la page Web. Une autre meilleure façon consiste à permettre au serveur de se souvenir de la session d'origine, c'est-à-dire d'enregistrer le SessionID d'origine dans le navigateur et d'envoyer le SessionId la prochaine fois que vous l'ouvrez, afin que le serveur ne le recréera pas.
Le code est modifié comme suit:
@Controller de classe publique IndexController {@RequestMapping ("/ count") @ResponseBody Public String Number (httpServLetRequest httpservletRequest, httpServletResponse httpservletResponse) {try {// record sessionId dans le cookie du navigateur C = new Cookie ("jssionId", Urlencoder.encode (httpsservletRequest.getSession (). GetID (), "utf-8")); C.SetPath ("/"); // Réglez la période de validité des cookies en premier à 2 jours, ne vous inquiétez pas, la session ne sera pas enregistrée pendant 2 jours C.SetMaxage (48 * 60 * 60); httpservletResponse.addcookie (c); } catch (exception e) {e.printStackTrace (); } HttpSession Session = httpServLetRequest.getSession (); Objet count = session.getServletContext (). GetAttribute ("count"); Retour "Count:" + Count; }}Résumer
Ce qui précède est une analyse de cas de Springboot en utilisant des moniteurs pour compter les utilisateurs en ligne introduits par l'éditeur. 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!