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
Inhaltsverzeichnis Vorwort Rendern Beispielcode Z...
Systemumgebung: Win10 64-bit MySQL-Version: mysql...
Inhaltsverzeichnis Variabler Typ und Speicherplat...
1. Python 3 herunterladen wget https://www.python...
Aus der Tomcat-Konfigurationsdatei können wir ers...
--1. Erstellen Sie eine neue Gruppe und einen neu...
Was ist ein Speicherleck? Ein Speicherleck bedeut...
Überblick Vorgänge, die auf einer Datenbank ausge...
Der wichtigste Schritt bei der Verpacken einer Id...
Inhaltsverzeichnis Zweck Modulinstallation Grundl...
Inhaltsverzeichnis Ergebnisse erzielen Vollständi...
Das img-Tag in XHTML ist ein sogenanntes selbstsc...
1. Einleitung Der Befehl Telnet dient zur Anmeldu...
In diesem Artikelbeispiel wird der spezifische Co...
In diesem Artikel wird anhand eines Beispiels bes...