Description générale
Il y a quelques jours, j'ai accidentellement pensé à ce problème et j'ai senti que c'était assez pratique et il était nécessaire de le régler. Il ne semble pas difficile d'écrire un mode simple avec désinvolture. Il est en fait assez simple de redresser l'idée.
Afin de réaliser que les utilisateurs ne peuvent pas se connecter en même temps, pensez simplement à Sina, Baidu, etc. En réalité, vous connectez-vous à un seul endroit et "pressez" l'autre endroit, et vous pouvez savoir quel est le résultat de l'implémentation. Ensuite, inversez-le et vous pouvez former une idée plus claire. Discutons-le ensemble.
Tout d'abord, nous devons comprendre quelle connexion est utilisée par les utilisateurs pour se connecter, c'est-à-dire le principe des utilisateurs en ligne. Il s'agit simplement de stocker l'objet de l'utilisateur dans la session, puis de l'appeler dans le cadre, et d'autres pages spécifiques peuvent être directement référencées. Ensuite, la fonction de «compression» consiste à rendre la session nouvellement générée efficace et à rendre la session stockée à l'origine dans l'utilisateur invalide. À ce stade, l'idée générale a été établie. Alors, comment y parvenir?
Si vous voulez savoir comment l'implémenter, vous devez comprendre le processus de stockage des objets utilisateur en session. Une fois que l'utilisateur s'est connecté, nous pouvons obtenir l'utilisateur de l'objet de l'utilisateur et le session.setAttribute(key,value); Nous stockons l'utilisateur de l'utilisateur ou un autre identifiant unique comme clé et enregistrons l'objet utilisateur en valeur. De cette façon, vous pouvez appeler le seul utilisateur à tout moment, n'importe où. Le problème du stockage des utilisateurs a été résolu, qu'en est-il du problème de l'abolition de la session lors de la connexion?
Ce n'est en fait pas difficile. Nous pouvons avoir plus de caractéristiques de session, tout comme l'utilisation de la carte pour stocker l'identité de l'utilisateur en tant que clé, et enregistrer la session correspondante en valeur. Ensuite, lorsque l'utilisateur se connecte à plusieurs reprises, il vous suffit de retirer la session correspondante et de l'invalider.
À ce stade, l'idée de mise en œuvre a été claire. Après si longtemps, tout le monde est impatient de lire le code, non? Voici le code:
Prépréparation, interface JSP
L'interface est simple, juste une interface de connexion simple
<form action = "<% = request.getContextPath ()%> / userwxpservlet" metheth = "post"> username š <input type = "text" name = "username" /> <br/> mot de passe Š <input type = "text" name = "mot de passe" /> <br/> <entrée type = "souples" value = "soumission" /> </ form>
Sautez sur la page après le succès
Bienvenue: ${sessionScope.user.username}登陆!<br/>
Je n'ai pas écrit de page ratée, vous pouvez l'écrire vous-même et il n'y a rien à dire sur la page échouée.
Implémentation de l'entité et de la connexion
Javabean de l'utilisateur
Nom d'utilisateur de chaîne privée; mot de passe de chaîne privé; Utilisateur public () {} Utilisateur public (Utilisateur de chaîne, mot de passe de chaîne) {super (); this.UserName = user; this.password = mot de passe; } public String getUserName () {return username; } public void setUsername (String username) {this.userName = username; } public String getPassword () {return mot de passe; } public void setPassword (String Motword) {this.password = mot de passe; }Connectez-vous à la méthode d'implémentation du service de l'utilisateur, donc je n'écrirai pas DAO et interface ici, tout est simple
Domaine booléen public (utilisateur utilisateur) {Properties pro = new Properties (); InputStream est = userwxpservlet.class.getClassloader (). GetResourceSstream ("user_wxp.properties"); Chaîne mot de passe = null; System.out.println (IS + "--------->" + pro); if (user == null) {return false; } essayez {pro.load (is); mot de passe = pro.getProperty (user.getUserName ()); if (user.getPassword ()! = null && user.getPassword (). equals (mot de passe)) {System.out.println ("connecter avec succès"); Retour Vrai; }} catch (ioException e) {e.printStackTrace (); } enfin {if (is! = null) {try {is.close (); } catch (ioException e) {e.printStackTrace (); }} return false; }Renvoie true si la connexion est réussie et fausse si elle échoue.
Servlet et classes d'outils logiques correspondants
Le code suivant est le véritable code pour faire fonctionner l'utilisateur
J'ai défini deux classes ici, une classe d'outils et une classe de traitement de servlet de base
Certains éléments communs sont ajoutés à la classe d'outils, comme le code suivant:
/ ** * Chaque utilisateur stocke une session. Facile à utiliser de toutes sortes de façons! ! ! * / public static map <string, httpSession> Mapsession = new hashmap <String, httpSession> (); Code de sortie de l'utilisateur (doit voler pour abolir ses session ou supprimer l'objet utilisateur correspondant): [Java] Voir Plain Copypublic Static void UserLogout (String username) {if (MapSession.get (nom d'utilisateur)! = NULL) {// Get the Sestern of l'utilisateur qui a besoin de quitter httpssion session = mapsession.get (username); // Supprimez l'utilisateur dans map <nom d'utilisateur, session>. N'oubliez pas de quitter l'utilisateur, vous devez abolir la session ou supprimer la Mapsession de l'utilisateur.Remove (nom d'utilisateur); // Obtenez la collection d'attributs de l'énumération de session E = session.getAtTrributeNames (); // Supprimer tous les attributs while (e.hasmoreElements ()) {String sessionname = (string) e.nextelement (); session.RemoveAttribute (sessionname); } // abrogation la session session.invalidate (); }}Le code du servlet est le suivant:
Protected void doGet (HttpServLetRequest Request, HttpServletResponse Response) lève Servlexception, ioException {String username = request.getParameter ("username"); String mot de passe = request.getParameter ("mot de passe"); Utilisateur utilisateur = nouvel utilisateur (nom d'utilisateur, mot de passe); UserService userService = new UserService (); HttpSession session = request.getSession (); if (userService.dologin (utilisateur)) {// Après la connexion, insérez l'utilisateur dans la session session.setAttribute ("utilisateur", utilisateur); if (cheaCkSession (nom d'utilisateur)) {// Si la session existe déjà avant cela, quittez l'utilisateur dbutil.userLogout (nom d'utilisateur); } // Stockage La nouvelle session dans map <nom d'utilisateur, session> dbutil.mapsession.put (nom d'utilisateur, session); // Une fois l'opération réussie, saut, il est préférable de rediriger ici pour faire savoir aux autres que la connexion a été une demande réussie.GetRequestDispatcher ("Connexion"). Forward (demande, réponse); retour ; } // Passez à la page de défaillance ici. Si les lecteurs sont intéressés, ils peuvent l'ajouter vous-même}Le code de coche (nom d'utilisateur) est le suivant:
/ ** * Vérifiez si cette session est déjà contenue * @param nom d'utilisateur * @return true: il existe déjà, il devrait être supprimé! FAUX: non présent * / private booléan Checkcession (string username) {httpSession session = dbutil.mapsession.get (nom d'utilisateur); if (session! = null) {return true; } return false; }Enfin, attachez la configuration XML du servlet
<Serplet> <D, description> Pour les tests, les utilisateurs ne peuvent pas se connecter à plusieurs reprises </ Description> <splay-name> userwxpservlet </splay-name> <Servlet-Name> userwxpservlet </vrlet-name> <Servlet-class> com.fingard.rabbit.wxp_test.servlet.userwxServlet </servlet-class> <Vertlet-Name> userWxPServlet </vrlett-name> <url-sattern> / userwxpservlet </url-potern> </ serplet-mapping>
Ce qui précède est la fonction Java que l'éditeur vous a présenté pour implémenter la fonction de connexion non répétée des utilisateurs. 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!