L'idée d'implémentation de Javaweb qui ne peut se connecter qu'à un seul endroit en même temps (similaire à la fonction de connexion QQ) est la suivante:
1. Quelle est la fonction de cette fonction?
Tout le monde y pense. Quoi qu'il en soit, il y aura toujours une telle demande. Il n'y aura pas de demande ces jours-ci. . hehe. Parfois, ce n'est pas une exigence, et il est très probable qu'il le fasse également pour la sécurité. Par exemple, le système d'examen et le système de chat en ligne sont nécessaires pour ce faire.
2. Processus de mise en œuvre
un. Analyse des problèmes
Dans le système, nous lions généralement les informations de connexion à la session. Il semble que commencer à trouver une solution. Pour le dire franchement, lorsque l'utilisateur se connecte, déterminez si l'utilisateur est connecté. S'il se connecte, il sera OK d'effacer la session précédente. . Cela semble très simple, non? En fait, si vous y réfléchissez attentivement, vous trouverez le problème suivant: comment faire en sorte que l'utilisateur s'est connecté auparavant, c'est-à-dire comment accéder à tous les informations de session connectées?
né Implémentation spécifique
Comme nous le savons tous, il ne semble pas y avoir de méthode spécifique pour obtenir directement toutes les informations de session dans l'API J2EE. Mais nous pouvons surveiller tous les processus de création et de destruction de session en configurant les auditeurs, ainsi que pour surveiller les processus de création, de suppression et de remplacement des attributs de la session.
En fait, nous avons juste besoin de faire ce qui suit:
Lors de l'enregistrement des informations de connexion de l'utilisateur à la session, la session correspondante est le processus attribué à la création d'un attribut, qui peut enregistrer la session en cours dans une liste Array.
En fait, lors de l'enregistrement de la liste, vous devez d'abord traverser s'il existe déjà les informations de connexion de l'utilisateur dans cette liste. S'il existe, détruisez les informations de session présentes dans cette liste et supprimez-la de la liste. S'il n'existe pas, mettez les informations de session dans la liste.
Lorsque les informations de connexion de la session sont détruites, supprimez directement la session de la liste.
De plus, lorsque l'utilisateur se connecte sans se connecter directement et se connecte directement, il s'agit d'un processus de remplacement de l'attribut de session. Il est également nécessaire de déterminer si le nouvel utilisateur existe déjà dans d'autres sessions en plus de la session en cours. S'il existe, supprimez-le.
Le code spécifique est le suivant:
package com.weirhp; import java.util.arraylist; import java.util.collections; import java.util.list; import javax.servlet.http.httpSession; import javax.servlet.http.httpSessionAttributeListener; import javax.servlet.http.httpsionbindeverveveva; javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;public class RecordSessionListener implements HttpSessionAttributeListener,HttpSessionListener {private static List<SessionAndUser> sessions;public static String loginFlag = "loginUser";static {if (sessions == null) {Sessions = CollectionS.SynchronizedList (New ArrayList <SessionAndUser> ());}} public void attributeAdded (httpSessionBindingEvent e) {httpSession session = e.getSession (); System.out.println ("-------------- * start ajouté * ------------------"); cela (tem.getUserId (). equals (nowuser.getName ())) {tem.getSession (). Invalidate (); // appelle automatiquement la devure SessionAndUser (); Sau.SetUserId (Nowuser.GetName ()); Sau.SetSession (Session); Sau.SetsId (Session.getID ()); Sessions.Add (Sau);}} public Void AttributereMoved (httSSessionBindingEvent E) {HTTPSESSSE Session = e.getSession (); System.out.println ("------------- * Démarrer * -----------------------"); String attName = e.getName (); // 登录 if (attName.equals (loginflag)) {user NowUser = (user) e.getValue (); // 遍历所有 sessionfor (int i = sessions.Size () - 1; i> = 0; i--) {SessionAndUser tem = sessions.get (i); if (tem.getUserId (). equals (NowUser.getName ())) {Sessions.reMove (i); Break;}}}} public void attributeReleplaced (httpSessionBinDindingEvent e) {hettpsession session = e.getSession (); System.out.println ("------------- * Démarrer Remplace * -------------------"); String attName = e.getName (); int dels = -1; // 登录 if (attName.equal (Utilisateur) session.getAttribute (loginflag); // l'utilisateur dans la session actuelle // traverse tous les sessionfor (int i = sessions.size () - 1; i> = 0; i--) {SessionAndUser tem = sessions.getName (i); if (tem.getUserId (). Equals (NowUser.getName ()) &&! {System.out.println ("Suppter: Invalidate 1!"); Dels = i;} else if (tem.getSid (). Equals (session.getId ())) {tem.SetUserId (nowuser.getName ());}} if (dels! = - 1) {Sessions.get (dels) .getssion invalidé. Il sera également supprimé des sessions}}} public void SessionCreated (httpSessionEvent e) {} public void SessionDestROYED (httpSessionEvent e) {}}Formulation dans web.xml
<Deurner> <Fichage-Name> RecordSession </ Display-Name> <auditeur-classe> com.weirhp.recordSessionListener </ écouteur-classe> </diner>
3. Problèmes possibles
Il peut y avoir des choses que tout le programme ne s'attendait pas. Il peut y avoir des bogues et vous devez être prudent lorsque vous êtes utilisé dans des projets spécifiques. Tout le monde est le bienvenu pour faire une photo et espérer faire quelques suggestions. Je vais l'améliorer à nouveau.
4. Quelques pensées plus tard
Si les deux machines utilisent le même compte pour se connecter au système en même temps, les deux comptes peuvent-ils être connectés avec succès? . (De plus, lorsque cette liste de session est très grande, deux machines peuvent se connecter avec succès lors de la connexion au système en utilisant le même compte en même temps pendant la période de traversée). Très enchevêtré. . Comment doit-il être contrôlé?
(Solution: Après les tests, l'auditeur est un singleton dans le système. L'ajout du mot-clé synchronisé à sa méthode peut garantir la sécurité du thread de la liste.)
Ce qui précède est le Javaweb vous a présenté que l'éditeur ne peut se connecter qu'à un seul endroit en même temps (similaire à la fonction de connexion QQ). 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!