Session oder Variable

LL0rd

Erfahrenes Mitglied
Hallo Leute,

ich habe mal eine Frage an die Servlet Experten von euch:

Ich habe festgestellt, dass - im gegensatz zu PHP - Java Servlets globale Variablen speichern und diese auch z.B. bei einem Reload der Seite gespeichert lassen. Ich habe z.B. folgenden Code geschrieben:

Code:
public static boolean firstrun=true;
public static String username="";

private static void init(HttpServletRequest request, HttpServletResponse response, String lang) throws IOException{
		if(firstrun){
			...
			HttpSession _session = request.getSession(); 
			DB.Connect();
			username= _session.getAttribute("username");
			firstrun=false;
		}
}

Dabei wird init bei jedem Servlet Aufruf aufgerufen und globale Variablen gesetzt. Aber wie lange bleiben die Variablen im Speicher erhalten? Verschwinden diese gleichzeitig mit der Session nach 30 min oder früher? Bisher habe ich nur feststellen können, dass mit einem Webserver restart die Variablen weg waren.
 
Hi,

Http ist ein zustandsloses Protokoll. Es wird immer nur ein HTTP-Request gesendet, der einen Response zur Folge hat. Sitzungen werden nicht aufgebaut. Dies ist für Warenkörbe etc. nicht so schön. Um den Client (und damit die Sitzung) serverseitig idenifizieren zu können sieht Servlet-Spezifikation zwei Verfahren vor:

Session-Identifikation durch URL-Rewriting
Session-Identifikation durch Cookies

Erstes Verfahren ist fehleranfällig und verhindert das setzen von sauberen Bookmarks. Die Spezifikation schreibt weiter vor, dass Cookies nicht über die Laufzeit des Clients gespeichert werden dürfen.

Sessions, egal über welches der Verfahren, verfügen über einen Timeoutmechanismus. Es gibt je nach AS Defaultwerte, man kann aber via Deployment-Descriptor den Wert setzen.

XML:
<session-config>
  <session-timeout>30</session-timeout>
</session-config>

Du kannst Variablen aber statt im Sessioncontext auch im Page, Request oder Applicationcontext speichern. Manchmal führt das Speichern von Sessionvariablen zu seltsamen Effekten, wenn der Client mit zwei Browserinstanzen arbeitet. Es wird ja dann nur ein Cookie geschrieben.

Gruß

EDIT:

P.S.
...
Dabei wird init bei jedem Servlet Aufruf aufgerufen und globale Variablen gesetzt. Aber wie lange bleiben die Variablen im Speicher erhalten? Verschwinden diese gleichzeitig mit der Session nach 30 min oder früher? Bisher habe ich nur feststellen können, dass mit einem Webserver restart die Variablen weg waren.

Die Variablen hängen am Session-Object und werden mit ihm gelöscht.
 
Zuletzt bearbeitet von einem Moderator:
Aber worin liegt jetzt denn genau der Unterschied zwischen dem Erstellen einer 0815 globalen Variable mit dem zu speichernden Inhalt zum richtigen Speichern in Cookies?
 
Zwei Dinge sind mir noch aufgefallen. Wo setzt Du die Variable, ich sehen nur das Lesen des usernamen aus dem Session-Kontext und warum sind Deine Methoden und Variablen statisch? Dann werden von allen Servlet-Instancen die selben Werte verwendet. Ist das in Deinem Sinn?

Gruß
 
Aber worin liegt jetzt denn genau der Unterschied zwischen dem Erstellen einer 0815 globalen Variable mit dem zu speichernden Inhalt zum richtigen Speichern in Cookies?

Die Daten werden Severseitig vorgehalten, bei Cookies clientseitig. Das führt zu einer viel höheren Netzlast.Einen Warenkorb müsstest Du bei Cookies ständig übers Netz schieben, selbst wenn nur ein Artikel dazukommt.
 
Die Daten werden Severseitig vorgehalten, bei Cookies clientseitig. Das führt zu einer viel höheren Netzlast.Einen Warenkorb müsstest Du bei Cookies ständig übers Netz schieben, selbst wenn nur ein Artikel dazukommt.

Bist du dir ganz sicher, dass bei einem Aufruf von _session.setAttribute(arg0, arg1) die Daten auf dem Client Rechner gespeichert werden? Bisher bin ich davon ausgegangen, dass es bei Servlets genauso funktioniert, wie bei PHP-Sessions - Auf dem Client Rechner wird ein Cookie erzeugt, dass eine ID enthällt. Zusätzlich wurde in einem tmp Verzeichnis eine Datenbank mit aktiven Sessions bereitgehalten. Auf dem Client Rechner wird außer der ID nichts gespeichert.

Und wenn ich sehe, dass es request.getSession().getId() gibt, kann ich mir kaum vorstellen, dass es anders sein kann.
 
Entweder habe ich mich unklar ausgedrückt, oder Du hast mich falsch verstanden. Im Cookie wird nur die Session-ID gespeichert. Alle anderen Daten werden Serverseitig im Sessioncontext gespeichert. Dieser Context wird vom Server nach Ablauf des Timeouts gelöscht. Das könnte er Clientseitig gar nicht, da ja möglicherweise keine Verbindung mehr besteht.
Sorry für die Unklarheit.

P.S. Die Sessionverwaltung wird im Tomcat von der Klasse die das Interface org.apache.catalina.Manager implementiert, verwaltet. Dies ist normalerweise die Klasse org.apache.catalina.session.StandardManager Der Quellcode kann eingesehen werden.;-)
 
Noch was zur Architektur:

Eine Session wird serverseitig (beim Tomcat) durch Objekte der Klasse org.apache.catalina.session.StandardSession repräsentiert. Außerhalb ihres Packages ist diese Klasse aber nicht direkt erreichbar. Sie wird deshalb von der Klasse org.apache.catalina.session.StandardSessionFacade umhüllt, um die Zugriffe auf die Session-Objecte zu isolieren. Alle Aufrufe der Facade werden an das Sessionobjekt delegiert.

Mit diesem Wissen, kann man das Verhalten, des Managers bzw. der Sessionklassen per server.xml anpassen. Man kann sogar ganz eigene Manager bzw. Sessionklassen schreiben.

Insbesondere, kann man den StandardManager durch einen (mitgelieferten) PersistenzManager austauschen. Dann kann der Server auch Sessions bei laufendem Betrieb auslagern (z.B. um mehr Sessions verwalten zu können). Session Infos wären dann auch nach einem Neustart noch vorhanden, Es gibt fertige Impementierungen für das Speichern in Datenbanken und im Dateisystem. Da hier mehrere Server auf die gleichen Daten zugreifen können, kann Szenarien mit mehr als einem Tomcat aufbauen.

Gruss
 
Zurück