In diesem Artikel verwendet das Projekt in Springboot den HttpSessionListener -Listener (einer der Hörer), um die Anzahl der Personen online zu zählen, was im Wesentlichen die Anzahl der Sitzungen zählt.
Die Idee ist sehr einfach, aber es gibt ein Detail, das ich nicht behandelt habe, also habe ich es länger als einen Tag debuggen, bevor ich den Fehler erledigt habe.
Schreiben Sie zuerst einen httpSessionListener -Listener. Die Anzahl ist die Anzahl der Sitzungen (Anzahl der Personen). Wenn die Sitzung erstellt wird, wird die Sitzungsmethode des Hörers ausgelöst. Wenn die Sitzung zerstört wird, wird die Sitzungsmethode des Hörers ausgelöst. Wenn Sie die Anzahl der Personen im Hörer berechnet haben, stellen Sie sie in den ServletContext ein (es kann als Repository verstanden werden, in dem jede Anforderung die Eigenschaften im Inneren speichern und erhalten kann).
Achten Sie darauf, dass @Weblistener dem Hörer hinzugefügt wird, sodass es nicht erforderlich ist, ihn zu konfigurieren.
@Weblistener Public Class OnlineCount implementiert httpSessionListener {public int count = 0; // Aufzeichnen Sie die Anzahl der Sitzungen // Hören Sie sich die Erstellung von Sitzungen an, synchronisierte anti-konzurent-bug-public synchron-void sessionscreated (httpSessionEvent arg0) {{system.prints "). zählen ++; arg0.getSession (). getServletContext (). setAttribute ("count", count); } @Override public synchronisierte void sessionDestroyed (httpSessionEvent arg0) {// Recocation System der Sitzung der Sitzung wiederholen. zählen--; arg0.getSession (). getServletContext (). setAttribute ("count", count); }}Schreiben Sie dann einen Controller, der die Anzahl der Sitzungen abfragt. Ich habe mit Folgendem angefangen, was falsch ist!
Nehmen Sie die Zählung vom ServletContext und der Rückgabe bis zum vorderen Ende.
@RequestMapping ("/count") @ResponseBody Public String Count (httpServletRequest httpServletRequest, httpServletResponse httpServletResponse) {Object Count = httpServletRequest.getServletContext (). GetatTribute ("count"); zurück "count:"+count; }Das ist falsch. Sie werden feststellen, dass die Seite sieht, dass die Anzahl null ist, weil keine Sitzung erstellt wird und es keine statistische Methode gibt, um den Hörer auszulösen. Also ändern Sie es:
@Controller public class IndexController {@RequestMapPing ("/count") @ResponseBody Public String Count (httpServletRequest httpServletRequest, httpServletResponse httpServletResponse) {httpSession Session = httpletResed.getSession (); Object count = session.getServletContext (). GetAtTribute ("count"); zurück "count:"+count; }} HttpSession Session = httpServletRequest.getSession (); Funktion: Wenn der Benutzer keine Sitzung hat, erstellt er eine Sitzung, und wenn es eine Sitzung gibt, erstellt er sie nicht.
Es scheint richtig zu sein, es in diesen Test zu ändern, aber es gibt ein Problem. Ein Browser entspricht einer Sitzung. Wenn Sie 2 Browser öffnen, sehen Sie, dass die Anzahl 2 ist, was korrekt ist. Wenn Sie jedoch einen Browser schließen und ihn öffnen, sollte er 2 sein und unverändert bleiben, aber es wird zu 3. Grund dafür, dass die Sitzungszerstörungsmethode nicht ausgeführt wird. Wenn Sie wieder geöffnet werden, kann der Server die ursprüngliche Sitzung des Benutzers nicht finden und eine Sitzung neu erstellen. Es gibt also 3 Sitzungen, aber es gibt nur 2 Browser, was bedeutet, dass es nur 2 Personen online in der Simulation geben sollte.
Es gibt zwei Möglichkeiten, dieses Problem zu lösen. Eine davon ist, eine Methode zu rufen, um die Sitzung beim Schließen der Webseite zu zerstören. Ein weiterer besserer Weg besteht darin, den Server an die ursprüngliche Sitzung zu erinnern, dh die ursprüngliche Sitzung im Browser aufzunehmen und die Sitzung des nächsten Mals zu senden, damit der Server ihn nicht neu erstellt.
Der Code wird wie folgt geändert:
@Controller Public Class IndexController {@RequestMapPing ("/count") @ResponseBody Public String Number (httpServletRequest httpServletRequest, httpServletResponse httpServletresponse) {try // record sessionid in the bowser cookie c = newnie Urlencoder.encode (httpServletRequest.getSession (). GetId (), "utf-8"); C.SetPath ("/"); // Setzen Sie die Cookie -Gültigkeitsdauer zuerst auf 2 Tage. Machen Sie sich keine Sorgen, die Sitzung wird nicht für 2 Tage C.SetMaxage (48 * 60 * 60) gespeichert. httpServletResponse.addcookie (c); } catch (Ausnahme e) {e.printstacktrace (); } HttpSession Session = httpServletRequest.getSession (); Object count = session.getServletContext (). GetAtTribute ("count"); zurück "count:"+count; }}Zusammenfassen
Die oben genannte Fallanalyse von Springboot unter Verwendung von Monitoren, um Online -Benutzer zu zählen, die vom Editor eingeführt wurden. Ich hoffe, es wird für alle hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird allen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!