Ich war in letzter Zeit im Leerlauf und habe keine Projekte zu tun. Deshalb habe ich einige häufige Probleme herausgegeben, auf die ich in meiner täglichen Arbeit gestoßen bin. Zunächst dachte ich über das Problem der Multi-Benutzer-Anmeldeinschränkungen nach. Lassen Sie mich einige Gedanken zu diesem Thema geben.
Verwandte Lesungen:
Java Web Development Perfekte Lösung, um zu verhindern, dass mehrere Benutzer wiederholt Anmeldung
1. Designszene
1) Ein Benutzer darf sich nicht gleichzeitig an mehreren Stellen anmelden
2) Der Benutzer hat sich bei A angemeldet. Es dürfte sich nun von B anmelden, aber er wird A ausdrücken (wenn man bedenkt, dass der Benutzer aufgrund der Umstände nach Anmeldung bei A in B war, möchte er jedoch die vorherige Arbeit fortsetzen, also muss er sich beim System anmelden)
3) Nach dem Drücken von A aus B wird das System eine Eingabeaufforderung angibt, wenn A andere Vorgänge ausführt. Der Benutzer protokolliert sich an anderer Stelle. Wenn das Passwort möglicherweise durchgesickert ist, wenn es nicht für seinen eigenen Betrieb gilt, ändern Sie bitte das Passwort.
2. Ideenkarte
Wenn sich jeder Benutzer anmeldet, speichern wir normalerweise Benutzerinformationen in der Sitzung, damit das System die grundlegenden Informationen des Benutzers bei der Ausführung von Operationen problemlos erhalten kann. Diese Sitzung ist jedoch privat und nur für den aktuellen Benutzer sichtbar (wenn Sie zustimmen, dass der Benutzer unterschiedliche Sitzungen erhält, ist dies die Hauptursache dafür, warum sich mehrere Benutzer anmelden können). Dann kommt die Frage: Wie kann ein Benutzer wissen, ob er beim Anmelden online ist? Ich glaube, Sie sind schlau, Sie haben bereits gedacht, dass dies nicht einfach ist. Ist das Problem nicht, Online -Benutzerinformationen an einem öffentlichen Ort zu speichern? Nach der Online -Überprüfung ist die Lösung völlig unterschiedlich und sind ungefähr die folgenden zwei Typen.
1) Identifizieren Sie Online -Benutzer in der Datenbank
2) In Anmeldung speichern
Nach vielen Überlegungen werden wir feststellen, dass Lösung 1 viele schwierige Probleme lösen muss (Benutzer abnormaler Ausstieg und zukünftiger Änderungsstatus, häufiger Zugriff auf die Datenbank beeinflussen die Leistung usw.), was für Sie offensichtlich unangemessen ist, die eine Perfektion benötigen. Deshalb haben wir Lösung 2 übernommen und Online -Benutzerinformationen in die Anwendung gespeichert, und das spezifische Design lautet wie folgt.
1) Anmeldeflussdiagramm
2) Operation Flow Diagramm, nachdem er herausgedrückt wurde
3. Code
1) Anmeldemethode
@RequestMapping (value = "/login", method = requestMethod.post) öffentlicher String -Login (String -Benutzername, String -Passwort, redirectTributes redirectTributes, httpServletRequest -Anfrage) {// beurteilen, ob der Benutzer online und verarbeitet wurde (entfernen Sie es. und Kennwort sind korrektes Zeichenfolge result = userService.login (Benutzername, Kennwort); if (result.equals ("Erfolg")) {Request.GetSession (). setAttribute ("now_user", userservice.findbyusername (Benutzername)); // Token erstellen und verrechnen String jwttoken = tokenService.createuserauthToken (Userservice.findbyusername (username)); tokenSystem.out.println (jwttoken); UserAauthenticationToken authToken = tokenservice.retrievErauthtoken (jwtToken); // Token Parse system.out.println (authToken.isauthenticated ()) System.out.println ("id =" + " + +" + + + + + + + + +; UserAuthenticationToken.getCurrentToken (). GetUseruuid ()); // Der Benutzer ist getrennt und leitet nach Anmelde an. if (url!2) Melden Sie sich an, um festzustellen, ob es bereits online ist
@Service @transactionalpublic class limitelogin {private static logger logger = logger.getLogger (sessionListener.class); private statische Karte <String, String> loginusmap = new HashMap <> (); // Speicher -Online -Benutzer -Benutzer -Station -Karten -Karten -Karten -Ownows -Benutzer -Ownows -Ownows. loginLimite (httpServletRequest -Anforderung, String -Benutzername) {user user = userService.findByUnername (Benutzername); String SessionID = Request.GetSession (). ! loginusmap.containSValue (sessionID)) {log.info ("Benutzer:" + user.getUnername () + ", in" + DateUtil.DateFormat (New Date (), "yjyyy-mm-mm-dd hh: mm: ss") + "ausgeschlossen!"). "yyyy-mm-dd hh: mm: ss")); loginusermap); request.getSession (). getServletContext (). setAttribute ("LoginoutTime", LoginoutTime); Rückgabe "Erfolg";}}3) Anmelde -Interceptor (Kein Anmeldung zum Anmeldeseite)
Die LoginInterceptor für öffentliche Klasse erweitert HandlerInterceptorAdapter {@Overridepublic boolean Prehandle (httpServletRequest Request, httpServletResponse -Antwort, Objekt Handler) löst Ausnahme aus {httpSession Session == null) {response.sendredirect (request.getContextPath () + "/other/tologin"); return false;} // Multi-Benutzer-Login-Restriktion Urteilsvermögen und geben Sie eine Eingabeaufforderung an. session.getServletContext (). getAtTribute ("loginusMap"); String SessionID = session.getId (); für (String -Schlüssel: loginusermap.keyset () {// Der Benutzer hat sich an einem anderen Ort angemeldet, wenn (key.equals (user.getusername) &&! true;break;}}}if (isLogin) {Map<String, String> loginOutTime = (Map<String, String>) session.getServletContext().getAttribute("loginOutTime");session.setAttribute("mess", "User:" + user.getUserName() + ", in " + loginOutTime.get(user.getUserName()) + "Logined An anderer Stelle! "); postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {super.postHandle(request, response, handler, modelAndView);}@Overridepublic void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)throws Exception {Super.afterCompletion (Anfrage, Antwort, Handler, Ex);}}4) Wenn die Sitzung zerstört wird, löschen Sie die in loginusermap gespeicherten Schlüsselwertpaare
public classSessionListener implementiert httpSessionListener {private static logger logger = logger.getLogger (sessionListener.class);@oversidepublic void Sessioncreated (httpSessionEvent Ereignis) {} @OverridePublic void SessionDesIneStroyed (httpSessionEvent Ereignis) {htttpublic voidSesion (httpSessionEvent Ereignis) {{htttpSessionS Session.) Ereignis. Session.getID (); // Wenn die Sitzung zerstört wird, löschen Event.GetSession (). getServletContext (). getAtTribute ("loginusermap"); if (loginusermap.get (user.getUnername ()). Equals (SessionID)) {log.info ("Clean User From Application:" + + user.getUnername ()); loginusermap.remove (user.getUnername ()); Event.GetSession (). getServletContext ().5) web.xml
<!-Session-Listener-Multi-Benutzer-Login-Beschränkungen, melden Sie sich an, um Sitzungsinformationen zu löschen, während die in der Anwendung gespeicherten Benutzeranmeldeinformationen gelöscht werden.
6) Seitencode (verwendet, um die Sitzungsinformationen des gepressten Benutzers bei der Angabe einer Eingabeaufforderung zu löschen. Andernfalls werden die Eingabeaufforderungsinformationen ständig angezeigt)
<script type = "text/javaScript"> $ (document) .ready (function () {var message = '$ {mess}'; if (message! {}}); $ ('#mess'). html (message);}}); </script>7) Löschen Sie den Benutzersitzungscode
/*** Multi-Benutzer-Login-Beschränkungen, Sitzungsinformationen (Anmeldeinformationen, Eingabeaufforderung) ** @param Anfrage*@return*/ @responseBody @requestmaping (value = "/clearUserSession") öffentliche String ClearUserSession (httpServletRequestanfrage) {httpSession httpSession = request.getSession (); // httpSession.invalidate (); httpSession.removeAttribute ("now_user");Die Entwicklungsarbeiten sind hier abgeschlossen
4. Betriebsergebnisse
Das obige ist die Implementierungsmethode von Java Multi-User-Anmeldeinschränkungen, die Ihnen vom Editor vorgelegt wurden. Ich hoffe, es wird Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird Ihnen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!