Die Funktion des einzelnen Anmeldens ist in den tatsächlichen Anwendungsszenarien immer noch sehr wichtig. Logischerweise erlauben wir einem Benutzer nicht, zwei Operationen gleichzeitig auszuführen. Erfahren wir über die einzelne Anmeldung von SpringMVC.
Der Interceptor von SpringMVC unterscheidet sich von Spring's Interceptor. SpringMVC verfügt über einen einheitlichen Eintrags -DispatcherServlet. Alle Anfragen werden durch Dispatherservlet geleitet, sodass Sie nur auf dem DispatcherServlet auftreten müssen. Der DispatcherServlet hat keinen Proxy, und der von SpringMVC verwaltete Controller hat keinen Proxy.
1. Erforschen Sie zuerst ein grundlegendes Implementierungsprinzip: Diese Funktion ist relativ einfach, dh nur ein Benutzer kann gleichzeitig mit demselben Webprojekt arbeiten. Hier finden Sie hier die Entdeckung einer Remote -Anmeldung und hier werden zwei Pfade eingeführt. 1. Der Server stellt fest, dass der angemeldete Benutzer den Anmeldevorgang erneut über eine andere IP durchgeführt hat, und drückt dann aktiv eine Erinnerung, um dem ersten Benutzer zu sagen, dass er sich in der Remote-Anmeldung anmelden soll. 2. Wenn der Benutzer Operationen ausführt, stellt er fest, dass sein Konto herausgedrückt wurde und es eine Remote -Login gibt. In Bezug auf diese beiden Lösungen ist der erste mehr Echtzeit, wird aber immer noch untersucht. Konzentrieren wir uns auf die zweite Methode unten.
2. Die Implementierung des zweiten Typs ist relativ einfach. Es gibt zwei Operationen. Eine davon besteht darin, der Sitzung des Benutzers ein zusätzliches Feld hinzuzufügen, um die Sitzung des angemeldeten Benutzers zu speichern, da jede Anforderungsanforderung einer eindeutigen nicht repetitiven Sitzung entspricht. Verwenden Sie dann die Interceptor -Technologie, indem Sie die Vorgänge des Benutzers abfangen. Im Interceptor wird die relevante URL -Anforderung auf der Anmeldeseite zuerst veröffentlicht, und die andere ist die Anmeldungsüberprüfungsanforderung. Filtern Sie schließlich den Benutzer. (Über die Nutzeranmeldung, wenn die Überprüfung erfolgreich ist, sollte der Benutzer nicht nur in der Sitzung zur Überprüfung der Anmeldungspflegespunkte gespeichert werden, sondern auch die Sitzungs -ID in der entsprechenden Sitzung in der Benutzertabelle.) Für die Anfrageanforderung können Sie diesmal die Sitzung und ihre ID vergleichbar und dann mit der SessionID in der Datenbank in dieser ID über die Entlassung übergeben. Wenn der Unterschied besteht, wird die Offline -Jump -Anmeldung aufgefordert, in die Anmeldung zu springen, da eine Sitzung in einem Benutzerverbindungsserverbetrieb vorliegt. Solange die Sitzung abläuft, ist die Sitzungs -ID der einzelnen im Benutzer eingeleiteten Operation gleich und entspricht der in der Datenbank gespeicherten ID bei der Anmeldung. Wenn jemand anderes andere Geräte durchläuft, verwenden Sie das gleiche Konto, um einzugeben. Die Sitzung wird bei der Anmeldung wiederhergestellt. Die Sitzung in der Datenbank wird die Sitzung in der Datenbank aktualisiert, die Sitzung ist jedoch weiterhin unverändert. Die Sitzung in der Datenbank hat sich jedoch geändert. Bei der Überprüfung, ob die Sitzung in der Datenbank im Interceptor konsistent ist, fängt sie daher den Betrieb des Benutzers nicht ab, um die Funktion der Einzelbenutzer-Anmeldung zu erreichen. (Ein Hinweis zur Sitzung, wenn der Benutzer zum ersten Mal eine Verbindung zum Server herstellt, wird eine Sitzung auf der Serverseite erstellt. Anschließend wird jeder vom Benutzer initiierte Operation die ID dieser Sitzung übertragen, und einige Situationen werden stattfinden. Der Benutzer hat lange Zeit nicht mit dem Server betrieben. Der Benutzer loget sich an und leitet die Sitzung die Sitzung nicht ungültig.
Das Folgende ist die Implementierung des Interceptor in SpringMVC
öffentliche Klasse SingleUserInterceptor implementiert HandlerInterzeptor {@autowiredPrivate UsMapper mapper; public void Aftercompletion (httpServletRequest arg0, httpServletRespon HttpServletResponse arg1, objekt arg2, modelandview arg3) löst Ausnahme aus {// Todo automatisch generierter Methode Stub} öffentlich boolean vorhandle (httpServletRequest arg0, httpServletresponse Arg1, Objekt arg2) Ausnahme {String-url = arg0.getREQUEDREQUEDREQUEUS (); if (url.indexof ("login.jsp")> = 0 || url.indexof ("new/login")> = 0 || url.indexof ("schütteln")> = 0) {return true;} // Wenn der Benutzername existiert (dh, Login und Release) Intiere -Benutzer = (intEger), (intEger)) arg0.getSession (). getAtTribute ("user"); if (user! sonst {arg1.setStatus (arg1.sc_gateway_timeout); arg1.setContentType ("text/html; charset = utf-8"); printwriter out = arg1.getWriter (); out.println ("<html>"); An anderer Stelle sind Sie gezwungen, offline zu gehen ') "); arg0.getRequestDispatcher ("login.jsp"). Forward (arg0, arg1); return false;}} arg0.getRequestDispatcher ("login.jsp"). Forward (arg0, arg0, arg1); return false;}}Der obige Code kann die Funktion des ersten protokollierten Benutzers erkennen, der von der Zeile gepresst wird, wenn sich derselbe Benutzer mehrmals anmeldet. Es kann die Funktion erkennen, das Konto zu formulieren, sich aus der Ferne anzumelden und dann zur Anmeldeseite zu springen. Hier müssen wir die wichtigsten Punkte dieser einfachen Alarmaufforderung erklären. Wenn diese Warnung erscheinen soll, muss es in der Lage sein, die Anfrage zu beenden. Dann gibt die Reaktionsdruckfunktion die Alert -Eingabeaufforderung -Anweisung aus, sodass die kommentierte Jump -Anweisung nicht existieren kann. Wenn dies vorhanden ist, wird die Alert -Eingabeaufforderung nicht ausgestellt, da Ihr Betrieb nicht korrekt endet, sondern an andere Operationen weitergeleitet oder weitergeleitet wird. Unabhängig davon, ob es korrekt ist oder nicht, wird es von anderen Aktionen auf die Seite ausgegeben, sodass Ihre Reaktionsdruckanweisung nicht angezeigt wird. Der richtige Weg ist also: Die Abnehmungsanforderung wird nicht veröffentlicht (returnFalse), und die Anfrage ist immer noch die ursprüngliche Anfrage und wird nicht springen. Die Druckinformationen der Antwort auf die Seite können angezeigt werden. Zum Springen zur Anmeldeseite können Sie: out.println ("window.open ('"+arg0.getContextPath ()+"/new/login', '_ top') verwenden;"); Um dies zu implementieren, wird eine Aktionsanforderung in einem Abschnitt der JS -Ausgabe durch die Antwort ausgeführt, wobei auf die Anmeldeseite verweist.
Der obige Code wurde im Grunde genommen als eine einzelne Benutzeranmeldungsfunktion angesehen. Sie werden jedoch feststellen, dass der Betrieb der AJAX -Anforderung bei der Anmeldung im Remote -Standort nicht auf die Anmeldeseite verweist, und es gibt keine Eingabeaufforderungsinformationen. Lassen Sie mich zunächst den Grund erklären, da Ihr Ajax eine asynchrone Anfrage stellt und die angeforderte URL auch im Prozessor Mapper übereinstimmt, sodass sie als erfolgreich angesehen wird (der Rückgabebatuscode ist 200). Die in der obigen Antwort gedruckte JS -Anweisung wird zur erfolgreichen Anfrage zum Erfolg und zum Rückgabewert. Sie können versuchen, den obigen Satz zu kommentieren: arg1.setStatus (arg1.sc_gateway_timeout); Zu diesem Zeitpunkt müssen einige andere Operationen durchgeführt werden. Die erste ist die Anweisung arg1.setStatus (arg1.sc_gateway_timeout); Seine Funktion besteht darin, den durch Antwort zurückgegebenen Statuscode festzulegen. Die obigen Einstellungen zeigen, dass der Statuscode 504 zurückgegeben wird, um einen Anforderungsfehler darzustellen. Zu diesem Zeitpunkt reagiert die AJAX -Anfrage nicht mehr in der Erfolgsmethode, sondern auf die AJAX -Fehlermethode. Daher müssen Sie die entsprechende Methode nur im AJAX -Fehler ausführen, z. B.:
$ .ajax ({url: 'new/msd2', Erfolg: Funktion (a) {alert (a);}, fehler: function (rs) {if (rs.status == 504) {document.write (rs.responSeText);}}});Wenn die AJAX -Anforderung aufgrund eines Remote -Login abgefangen wird, setzen Sie arg1.setStatus (arg1.sc_gateway_timeout); Der Rückgabestatus der Anforderung kann in 504 geändert werden. Dann antwortet die Fehlermethode. Wenn festgestellt wird, dass der Status der Statuscode ist, den Sie festgelegt haben, document.write (rssponsetext); ResponText ist die JS -Anweisung, die an der Rezeption im Interceptor gedruckt wurde. Damit diese Aussagen ausgeführt werden sollen, ist das Dokument.Write (); Die Methode muss den Code an den DOM schreiben, damit er wirksam wird. Zu diesem Zeitpunkt wurden alle Anfragen und einzelne Anmeldungen für asynchrone AJAX-Anfragen im Grunde genommen implementiert.
Lassen Sie diesen Artikel nur, um den Schlüsselcode, die Ideen und Prinzipien von Operationen aufzuzeichnen
Zusammenfassen
Im obigen Bereich dreht sich alles um die Implementierung von Single Sign-On im SpringMVC Interceptor. Ich hoffe, es wird für alle hilfreich sein. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite.