Vorwort Ich habe zufällig entdeckt, dass die halbstündige Tomcat-Sitzungsdauer nicht bedeutet, dass die Sitzung nach dem Erstellen nur eine halbe Stunde gültig ist, sondern dass die Sitzung nach einer halben Stunde Inaktivität gelöscht wird. Ich habe gerade den Quellcode durchgeblättert. Habe ein bisschen aufgeräumt. Hinweis: Mit Leerlaufzeit ist das Intervall zwischen zwei Anfragen in derselben Sitzung gemeint. Sitzungsbezogenes Klassendiagramm
Managerbezogenes Klassendiagramm StandardManager und PersitentManager sind beide Implementierungen von Manager, sie unterscheiden sich jedoch in der Art und Weise, wie sie Sitzungsobjekte speichern. StandardManager 1. Wenn Tomcat ausgeführt wird, wird die Sitzung im Speicher gespeichert 2. Wenn Tomcat heruntergefahren wird (beachten Sie, dass es sich um einen normalen Herunterfahrvorgang und nicht um einen plötzlichen Absturz handelt), wird die Sitzung auf die Festplatte geschrieben und nach dem Neustart von Tomcat erneut geladen. PersistentManager 1. Speichern Sie die Sitzung immer auf der Festplatte. Beziehung zwischen Manager und Kontext In Tomcat ist ein Kontext eine Anwendung (Webanwendung), die in Tomcat bereitgestellt wird. Jeder Kontext verfügt über ein separates Managerobjekt zum Verwalten der Sitzungsinformationen der Anwendung. So speichert Manager Sitzungen Das Manager-Objekt verwendet eine Map zum Speichern von Sitzungsobjekten
/** * Die Menge der derzeit aktiven Sitzungen für diesen Manager, sortiert nach * Sitzungskennung. */ geschützte Map<String, Session> Sitzungen = neue ConcurrentHashMap<>(); Wenn eine Anforderung im Kontext eintrifft und sie ein JSESSIONID-Cookie enthält, kann der Manager das zugehörige Sitzungsobjekt finden und in das Anforderungsobjekt einfügen. Regelmäßige Überprüfung des Managers Die Manager-Schnittstelle verfügt über eine Methode backgroundProcess(), bei der es sich, wie der Name schon sagt, um eine Hintergrundverarbeitung handelt. /** * Diese Methode wird vom Kontext/Container in regelmäßigen Abständen aufgerufen * Basis und ermöglicht dem Manager die Umsetzung * eine Methode, die periodische Aufgaben ausführt, wie z. B. das Ablaufen von Sitzungen usw. */ öffentliche void Hintergrundprozess(); Hinweis: Die Container-Schnittstelle verfügt auch über diese Methode. Diese Methode startet normalerweise einen zusätzlichen Thread, um die Methode backgroundProcess auszuführen, wenn der Container gestartet wird. Nachdem diese Context-Methode gestartet wurde, werden die BackgroundProcess-Methoden von Loader und Manager ausgeführt. Schauen wir uns an, was diese Methode macht. /** * {@inheritDoc} * <p> * Direkter Aufruf von {@link #processExpires()} */ @Überschreiben public void Hintergrundprozess() { Anzahl = (Anzahl + 1) % processExpiresFrequency; if (count == 0) //Wenn die Prüfhäufigkeit erreicht ist, beginne mit der Prüfung processExpires(); } /** * Alle abgelaufenen Sitzungen ungültig machen. */ public void Prozess läuft ab() { lange ZeitJetzt = System.currentTimeMillis(); Sitzung session[] = findSessions(); //Alle Sitzungsobjekte abrufen int expireHere = 0 ; //Anzahl der abgelaufenen Sitzungen, lassen Sie sich nicht von diesem Variablennamen täuschen if(log.isDebugEnabled()) log.debug("Starten Sie ablaufende Sitzungen " + getName() + " um " + timeNow + " sessioncount " + sessions.length); für (int i = 0; i < Sitzungslänge; i++) { wenn (sessions[i]!=null und !sessions[i].isValid()) { läuft hier ab++; } } langes timeEnd = System.currentTimeMillis(); if(log.isDebugEnabled()) //Datensätze drucken log.debug("Ende abgelaufener Sitzungen " + getName() + " processingTime " + (timeEnd - timeNow) + " abgelaufene Sitzungen: " + expireHere); Verarbeitungszeit += (Endzeit – Jetztzeit); } Viele Leute haben möglicherweise die gleichen Zweifel wie ich, wenn sie dies sehen. Das heißt, es gibt keinen Vorgang zum Ablaufen der Sitzung, es scheint, als würde nur eine Statusprüfung durchgeführt. Aber später sah ich die Implementierung der isValid-Methode der Session und verstand alles. /** * Gibt das Flag <code>isValid</code> für diese Sitzung zurück. */ @Überschreiben öffentliches Boolean ist gültig() { wenn (!this.isValid) { gibt false zurück; } wenn (dies.abläuft) { gibt true zurück; } wenn (ACTIVITY_CHECK && accessCount.get() > 0) { gibt true zurück; } //Der entscheidende Punkt //Wenn die maximale Leerlaufzeit festgelegt ist, //rufe die Leerlaufzeit dieser Sitzung ab, um sie zu beurteilen. //Wenn die Zeit abgelaufen ist, führe den Ablaufvorgang aus, if (maxInactiveInterval > 0) { In diesem Beispiel wird die Zeit für die Idle-Zeit in der Idle-Datenbank verwendet. wenn (Leerlaufzeit >= maxInaktivesIntervall) { ablaufen(wahr); } } gib dies zurück.isValid; } Zusammenfassen Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM. Das könnte Sie auch interessieren:
|
<<: So nummerieren Sie die Ergebnisse von MySQL-Abfragedaten automatisch
>>: js implementiert eine einfache dreistufige Auswahlkaskade für Provinzen, Gemeinden und Bezirke
Im vorherigen Artikel haben wir vorgestellt, wie ...
Inhaltsverzeichnis 1. Einleitung 2. Bereiten Sie ...
In diesem Artikel wird hauptsächlich der Beispiel...
Kürzlich habe ich festgestellt, dass nach der Ver...
1. Beispiel einer Dropdown-Liste Der Code lautet ...
Heute lernen wir, wie man mit CSS eine coole Bild...
Wenn Sie den FTP-Server häufig in Ihrem Studium o...
Lösung zum Vergessen des MySQL-Passworts: [root@l...
Ich bin in letzter Zeit beim Erlernen von Docker ...
Der CSS-Implementierungscode zum Festlegen des Bi...
Inhaltsverzeichnis 1. Vier Konzepte 1. JavaScript...
In diesem Artikelbeispiel wird der spezifische Co...
Inhaltsverzeichnis Gedanken, die durch eine Onlin...
Inhaltsverzeichnis Vorwort 1. Erstellen Sie ein n...
Beim Entwickeln und Debuggen einer Webanwendung s...