Cet article introduit principalement l'utilisation de l'écoute de session en Java pour obtenir des restrictions de connexion et un nombre de connexions pour le même compte. Le code spécifique est le suivant:
Domaine du problème:
1. Connectez-vous avec le même compte: si ce compte est déjà connecté, vous ne pouvez pas vous connecter à nouveau (le contraire du mode QQ).
2. Si le nombre de connectés est limité, si le nombre de personnes dépasse ou a été atteint, l'invite est: le système est occupé, réessayez plus tard.
Solution: Utilisez l'écouteur HTTPSessionAttributeListener (bien que j'aie utilisé le HTTPSessionListener en même temps, il semble difficile de fonctionner)
Réserve de connaissances: httpSessionAttributeListener a trois méthodes: AttributeAdd, AttributeRemove et Attributereplace.
Le setAttribute et la RemoveAttribute de la session déclenchent les méthodes AttributeAdd et AttributeRemove. Les paramètres répétés du même attribut de la même session déclencheront la méthode Attributereplace.
La raison pour laquelle HTTPSessionListener est difficile à utiliser: tant que vous accédez à la page JSP, vous créerez une session (vous ne créerez pas de session lorsque vous accédez au HTML. Du côté du serveur, par exemple, si vous appelez HttpservletRequest.getSession (true) dans le servlet, vous le créez). JSP est une page dynamique et est essentiellement un servlet. Mon login.jsp est évidemment un jsp. Lorsque j'invalide une session dans l'auditeur et que je reviens à la page de connexion, j'ai immédiatement créé une autre session. C'est quelque chose dont je ne me sens pas clair, et je ne suis pas rentré à la maison de mes compétences.
Implémentation spécifique:
Code de l'auditeur
Classe publique OnlineListener implémente httpSessionListener, httpSessionAtTributEListener {private static List <SessionAndUser> Sessions; statique int dels = -1; Flag booléen statique = false; statique {if (sessions == null) {sessions = collections .SynchronizedList (new ArrayList <SessionAndUser> ()); }} public void SessionCreated (httpSessionEvent HSE) {System.out.println (hse.getSession () + "-" + new Date ()); System.out.println (hse.getSession () + "-" + new Date ()); } public void SessionDestRoyed (httpSessionEvent hse) {System.out.println ("------------- SessionDestRoyed () -----------"); System.out.println (hse.getSession () + "" + new Date (hse.getSession (). GetLastAccessEdTime ())); System.out.println (hse.getSession () + "" + new Date ()); } public void attributeAdded (httpSessionBindingEvent e) {System.out.println ("------------- * Démarrer * -----------------------" + sessions.size ()); HttpSession Session = e.getSession (); ActionContext ctx = actionContext.getContext (); boolean newone = true; String attName = e.getName (); // Connectez-vous if (attName.equals (constant.user_name)) {// Vérifiez le nombre de connexions if (sessions.size ()> = constant.user_limit) {newone = false; ctx.put ("timeoutmsg", "serverbusy"); } String NowUser = (String) e.getValue (); // Traversé toutes les sessions pour vérifier si vous vous êtes connecté. Si c'est le cas, il invite que vous vous êtes connecté pour (int i = sessions.size () - 1; i> = 0; i--) {SessionAndUser tem = sessions.get (i); if (tem.getUserName (). equals (NowUser)) {newone = false; ctx.put ("timeoutmsg", "a été déposé"); // tem.getSession (). Invalidate (); // // se connecter avec le même compte et appeler automatiquement supprimer la pause; }} // Ajouter le nouveau compte de connexion à la liste de maintenance du compte if (newone) {SessionAndUser sau = new SessionAndUser (); SAU.SetUsername (NowUser); SAU.SETSESSE (SESSION); sau.setsid (session.getId ()); sessions.add (SAU); }}} public void attributeRemoved (httpSessionBindingEvent e) lève illégalStateException {httpSession session = e.getSession (); System.out .println ("------------- * Démarrer * ----------------------" + Sessions.Size ()); if (dels> -1) {if (flag) {sessions.Remove (dels); Flag = false; }} else {// 登录 String attRname = e.getName (); if (attName.equals (constant.user_name)) {String NowUser = (String) e.getValue (); // Traverse toutes les sessions pour (int i = sessions.size () - 1; i> = 0; i--) {SessionAndUser TEM = sessions.get (i); if (tem.getUserName (). equals (nowuser)) {sessions.remove (i); casser; }}}}} public void attributeReplaced (httpSessionBindingEvent e) {httpSession session = e.getSession (); System.out .println ("------------- * Démarrer Remplacer * ----------------------" + Sessions.Size ()); String attName = e.getName (); dels = -1; // 登录 if (attName.equals (constante.user_name)) {// user NowUser = (user) e.getValue (); // vieille valeur String NowUser = (String) session.getAttribute (constante.user_name); // 当前 session 中的 user // Traverse toutes sessions.get (i); if (tem.getUserName (). equals (NowUser) &&! tem.getSid (). equals (session.getId ())) {System.out.println ("supprimer: invalider 1!"); dels = i; Flag = true; } else if (tem.getSid (). equals (session.getId ())) {tem.SetUsername (NowUser); }} if (dels! = -1) {sessions.get (dels) .getSession (). Invalidate (); // La méthode de suppression est automatiquement appelée lorsqu'elle échoue. Il sera également supprimé des sessions}}}} L'idée principale du code est de définir une liste statique <SessionAndUser> pour stocker la session et le nom de compte.
Le code pour obtenir la valeur de retour de l'écoute et le traiter dans l'action connectée
session.setAttribute (constant.user_name, opérator.getUserName ()); ActionContext ctx = actionContext.getContext (); if ("serverbusy" .equals (ctx.get ("timeoutmsg"))) {ctx.put ("timeoutmsg", "le serveur est occupé, veuillez réessayer plus tard"); retourner "saut"; } if ("été à gorge" .equals (ctx.get ("timeoutmsg"))) {ctx.put ("timeoutmsg", "Ce compte est connecté ailleurs"); retourner "saut"; } Capture de la page Code des informations de l'invite
<% @ taglib prefix = "s" uri = "/ struts-tags"%> <s: propriété value = "# att.timeoutmsg" />
Merci d'avoir lu, j'espère que cela peut vous aider. Merci pour votre soutien à ce site!