J'ai été inactif récemment et je n'ai pas de projets à faire, alors j'ai réglé quelques problèmes communs que j'ai rencontrés dans mon travail quotidien. Tout d'abord, j'ai pensé au problème des restrictions de connexion multi-utilisateurs. Permettez-moi de donner quelques réflexions sur cette question.
Lectures connexes:
Solution parfaite du développement Web Java pour empêcher plusieurs utilisateurs de la connexion répétée
1. Scène du design
1) Un utilisateur n'est pas autorisé à se connecter plusieurs endroits en même temps
2) L'utilisateur s'est connecté à A. Il est désormais autorisé à se connecter à partir de B, mais il révèlera un (étant donné que l'utilisateur a été à B en raison de certaines circonstances après s'être connectée à A, mais veut toujours poursuivre les travaux précédents, il doit donc se connecter au système)
3) Après avoir pressé un sur B, le système donnera une invite lorsque A effectuera d'autres opérations. L'utilisateur se connecte ailleurs. Si le mot de passe peut être divulgué sans sa propre opération, veuillez modifier le mot de passe.
2. Carte d'idées
Lorsque chaque utilisateur se connecte, nous stockons généralement des informations de l'utilisateur dans la session afin que le système puisse facilement obtenir les informations de base de l'utilisateur lorsque l'utilisateur effectue des opérations. Cependant, cette session est privée et n'est visible que pour l'utilisateur actuel (si vous acceptez que l'utilisateur obtiendra différentes sessions, ce qui est la cause première des raisons pour lesquelles plusieurs utilisateurs peuvent se connecter). Ensuite, la question vient, comment un utilisateur peut-il savoir s'il est en ligne lors de la connexion? Je crois que vous êtes intelligent, vous avez déjà pensé que ce n'était pas facile. N'est-ce pas le problème du stockage des informations des utilisateurs en ligne dans un lieu public? Après avoir vérifié en ligne, la solution est complètement différente et ce sont à peu près les deux types suivants.
1) Identifier les utilisateurs en ligne dans la base de données
2) Stocker en application
Après de nombreuses considérations, nous constatons que la solution 1 doit résoudre de nombreux problèmes difficiles (sortie anormale des utilisateurs et l'état de modification future, un accès fréquent à la base de données affecte les performances, etc.), ce qui est évidemment inapproprié pour vous qui a besoin de perfection. Nous avons donc adopté la solution 2, en enregistrant les informations utilisateur en ligne dans l'application, et la conception spécifique est la suivante.
1) Tableau de débit de connexion
2) Opération Tableau de débit après avoir été pressé
3. Code
1) Méthode de connexion
@Requestmapping (value = "/ login", méthode = requestMethod.post) Public String Login (nom d'utilisateur de chaîne, mot de passe de chaîne, redirectattributes redirectattributes, httpsservletRequest request) {// jugez si l'utilisateur a été en ligne et traité (supprimer est en ligne) Loginlimite = limite de punklogin.loginlimite (request, username); Correct String result = userservice.login (nom d'utilisateur, mot de passe); if (result.equals ("succès")) {request.getSession (). setAttribute ("NOW_USER", USERSERVICE.FINDBYUSERNAME (nom d'utilisateur)); // Créer Token et Verify String Jwttoken = Tokenservice.CreateUserAuthToken (UserService.FinSeusername (UserName)); // CreateAuthToken tokenSystem.out.println (jwttoken); userAuthenticationToken authtoken = tokenService.RerieveUserAuthToken (jwttoken); // token parses system.out.println (idtoken.isauthenticated ()); system.out.println ("id =" + UserAuthenticationToken.getCurrentToken (). GetUserUuid ()); // l'utilisateur est déconnecté et redirige vers le lien enregistré après la connexion. if (url! = null) {request.getSession (). removeAttribute ("redirect_link"); return "redirect:" + url.toString ();} return "index";} redirectattributes.addflashAttribute ("message", résultat); redirectattributes.adddflashAttribute (}2) Connectez-vous pour déterminer s'il est déjà en ligne
@ Service @ transactionalpublic class LimileLogin {private static logger log = logger.getlogger (sessionListener.class); carte statique privée <string, string> LoginUserMap = new hashmap <> (); // Storage en ligne utilisateurs statics privés <String, String> LoginoutTime = new hashmap <> () Loginlimite (httpServLetRequest request, String username) {user user = userservice.findByUserName (username); string sessionId = request.getSession (). getId (); for (string key: loginUserMap.KeySet ()) {// l'utilisateur a connecté à un autre endroit if (clés. ! LoginUserMap.ContainsValue (sessionId)) {log.info ("user:" + user.getUserName () + ", dans" + dateUtil.dateFormat (new Date (), "yyyy-mm-dd hh: mm: ss") + "Excluded!"); dateForat (user.getUserAm "Yyyy-mm-dd hh: mm: ss")); loginUserMap.Remove (user.getUserName ()); Break;}} LoginUserMap.put (user.geTuserName (), sessionId); request.getSession (). GetServletContex LoginUserMap); request.getSession (). getServletContext (). SetAttribute ("LoginoutTime", LoginoutTime); return "Success";}}3) Interceptor de connexion (pas de connexion pour sauter à la page de connexion)
classe publique LoginInterceptor étend HandlerInterceptorAdapter {@OverRidePublic Boolean Prehandle (HttpServLetRequest Request, HttpservletResponse, User User = (User) session.GetAttribute ("maintenant null) {réponse.sendRedirect (request.getContextPath () + "/ autre / tologin"); return false;} // le jugement de restriction de connexion multi-utilisateurs, et donne un message rapide booléen islogin = false; if (user! = null) {map <string, string> liginusermap = (map <String, string>)) session.getServletContext (). getAttribute ("LoginUserMap"); String SessionID = session.getId (); For (String Key: LoginUserMap.KeySet ()) {// L'utilisateur s'est connecté à un autre endroit if (Key.equal true; Break;}}} if (islogin) {map <string, string> liginoutTime = (map <string, string>) session.getServletContext (). getAttribute ("LoginoutTime"); session.setAttribute ("Mess", "user:" + user.geturname () + ", dans" + LoginoutTime.get (user.getEname ()) + " Ailleurs! "); LoginoutTime.Remove (user.getUserName ()); session.getServletContext (). SetAttribute (" LoginUserMap ", LoginoutTime); Response.SenDredirect (request.getContextPath () +" / autre / Tologin "); retourne false;} return super.phendle (request, réponse, handler);}} @ surserpublic Posthandle (HttpServLetRequest Request, HttpServletResponse Response, Object Handler, ModelandView ModelAndView) lève une exception {super.posthandle (demande, réponse, gestionnaire, ModelandView);} @ OverRidepublic Void AftercomPletion (HTTPSERVERTREDEL {super.AfterCompletion (demande, réponse, gestionnaire, ex);}}4) Lorsque la session est détruite, effacez les paires de valeurs clés enregistrées dans LoginUserMap
ClassSessionSesSheSener implémente httpSessionListener {private static logger log = logger.getLogger (sessionListener.class); @ OverRidepublic void sessionCreated (httpSessionEvent Event) {} @OverRidepublic void SessionDestRoyed (httpSessionEvent EventiD) {HTTPSession Session = event.getSession (); String SessionId = session.getID (); // Lorsque la session est détruite, effacez la paire de valeurs de clé enregistrée dans LoginUserMap User User = (User) session.getAttribute ("NOW_USER"); if (User! = NULL) {Map <String, String> LoginUserAP = (Map <String, String>) event.getSession (). getServletContext (). getAttribute ("LoginUserMap"); if (LoginUserMap.get (user.getUsername ()). user.getUserName ()); LoginUserMap.Remove (user.getUserName ()); event.getSession (). getServletContext (). setAttribute ("LoginUserMap", LoginUserMap);}}}}5) web.xml
<! - Restrictions de connexion multi-utilisateurs de l'auditeur de session, déconnectez-vous pour effacer les informations de session tout en effaçant les informations de connexion utilisateur stockées dans l'application -> <ouciner> <classeur d'écouteur> com.service.limitelogin.sessionListener </ auteur-classe> </ auditeur>
6) Code de page (utilisé pour effacer les informations de session de l'utilisateur pressé tout en donnant une invite, sinon les informations rapides seront affichées tout le temps)
<script type = "text / javascript"> $ (document) .ready (function () {var message = '$ {mess}'; if (message! = "") {$ .ajax ({type: 'get', async: false, cache: false, url: '/ autre / clearUserSession', dataty {}}); $ ('# mess'). html (message);}}); </ script>7) Effacer le code de session utilisateur
/ *** Restrictions de connexion multi-utilisateurs, informations de session effacées (informations de connexion, informations proches) ** @param request * @return * / @ réponsebody @ requestmapping (value = "/ clearUserSession") public String ClearUserSession (httpServleRequest request) {httScession httpSession = request.getSession (); // httpSession.Invalidate (); httpSession.reMoveAtTribute ("NOW_USER"); httpSession.reMoveAtTribute ("Mess"); retour "Success";}Le travail de développement est terminé ici
4. Résultats de l'opération
Ce qui précède est la méthode d'implémentation des restrictions de connexion multi-utilisateurs Java qui vous sont présentées par l'éditeur. J'espère que cela vous sera utile. Si vous avez des questions, veuillez me laisser un message et l'éditeur vous répondra à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!