![]() |
|
|
Alle Methoden liefern eine IllegalStateException, wenn die Sitzung ungültig ist. Die Methoden putValue() und setValue() sind veraltet und wurden durch setAttribute() und getAttribute() ersetzt. 17.14.3 URL-Rewriting
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Beispiel Eine URL für einen Cookie besitzt keine Sitzungskennung.
http://localhost/servlet/URLRewritingSession
Mit URL-Rewriting sieht das dann etwa so aus: http://localhost/servlet/URLRewritingSession;jsessionid=abcde234 |
Wenn wir innerhalb eines Servlets auf eine andere generierte Seite verweisen wollen, so haben wir eine URL vor uns, zu der wir verzweigen möchten. Die Servlet-API kümmert sich darum, dass zu einer Benutzer-URL die Sitzungs-ID automatisch angehängt wird. Dazu dienen die HttpServletResponse-Methode encodeURL() oder encodeRedirectURL().
Beispiel Es soll aufgrund einer Formularbestätigung auf eine JSP-Seite mit dem Namen validate.jsp verwiesen werden.
<form action=’<%= response.encodeURL("/validate.jsp") %>’> |
Werden der Verweis und die Kodierung aus Versehen vergessen, dann ist dies das Ende der Sitzung. Ob eine Sitzung mit einem Cookie behandelt wird, lässt sich mit isRequestedSessionIdFromCookie() testen. Dann kann aufgrund einer Fallunterscheidung encodeURL() verwendet werden oder nicht. Allgemein ist es aber nicht schlecht, wenn grundsätzlich alle Verweise innerhalb einer Webapplikation mit encodeURL() gesichert werden. Zwar wird im Fall von Cookies keine Kennung angehängt, aber eine spätere Umstellung fällt dann leichter, wenn der Nutzer einmal Cookies ausschaltet.
Ein Sitzungsobjekt verwaltet neben den assoziierten Daten noch weitere Informationen. Jede Sitzung bekommt eine eindeutige ID, die sich mit getId() erfragen lässt. Ist die Sitzung neu, und der Client hat noch nie eine Verbindung gehabt, so gibt isNew() den Wert true zurück. Existiert dann die Sitzung, gibt getCreationTime() ein long zurück – kodiert sind wie üblich die vergangenen Millisekunden seit dem 1.1.1970 –, in dem sich das Erstellungsdatum erfragen lässt. Dagegen erfragt getLastAccessedTime() die Zeit, die seit dem letzen Zugriff durch den Client vergangen ist. Falls der Server die Informationen dauerhaft speichert und der Cookie nicht abläuft, erlaubt dies Meldungen der Art: »Schön, Sie nach zwei Wochen zum fünften Mal bei unserer Partnervermittlung wiederzusehen. Hat's wieder nicht geklappt?«
Eine Sitzung ist nicht automatisch für unendlich lange gültig. Bei Cookies lässt sich der Gültigkeitszeitraum einstellen. Auch Sitzungsobjekte lassen sich in der Zeit anpassen. Die Methode setMaxInactiveInterval() setzt den Wert, den eine Sitzung gültig ist. Ist der Wert negativ, zeigt er an, dass die Sitzung nicht automatisch beendet wird. Die entsprechende Methode getMaxInactiveInterval() liefert die Zeit in Sekunden, in der eine Sitzung gültig ist.
interface javax.servlet.http. HttpSession |
| long getCreationTime() Gibt in Millisekunden ab dem 1.1.1970 an, wann die Sitzung eröffnet wurde. |
| String getId() Liefert eine eindeutige Kennung, welche die Sitzung identifiziert. |
| long getLastAccessedTime() Gibt in Millisekunden ab dem 1.1.1970 zurück, wann der Client zum letzten Mal auf den Server zugegriffen hat. |
| int getMaxInactiveInterval() void setMaxInactiveInterval( int interval ) Liefert und setzt die Zeit, für die der Servlet-Container die Sitzung aufrechterhalten soll, bis sie ungültig wird. |
| boolean isNew() Der Rückgabewert ist true, wenn die Sitzung neu ist. |
| Beispiel Zum Schluss wollen wir ein Programm formulieren, welches alle diese Informationen auf einmal ausgibt. |
Listing 17.18 sessionTracking.jsp
<%@ page language="java" import="java.util.*" %> <% int cnt = 0; if ( session.isNew() ) { out.println( "Willkommen Neuling!\n" ); } else { out.println( "Hallo alter Freund!\n" ); String o = (String) session.getAttribute( "cnt" ); if ( o != null ) cnt = Integer.parseInt( o ); cnt++; } session.setAttribute( "cnt", ""+cnt ); %> <p> Session-ID: <%= session.getId() %> <p> Erzeugt am: <%= new Date(session.getCreationTime()) %> <p> Letzter Zugriff: <%= new Date(session.getLastAccessedTime()) %> <p> Ungültig in Minuten: <%= session.getMaxInactiveInterval()/60 %> <p> Anzahl Zugriffe: <%= cnt %>
Das Programm liefert beispielsweise folgende Ausgabe:
Hallo alter Freund! ID: 91410050092487D9B5D0D2A7A3D0F072 Erzeugt am: Fri Jan 18 20:16:49 CET 2002 Letzter Zugriff: Fri Jan 18 20:23:33 CET 2002 Ungültig in Minuten: 30 Anzahl Zugriffe: 4
Die ID sieht bei jedem Server anders aus. Der Web-Server von Sun erzeugt beispielsweise ganz andere Kennungen.
Die Sitzungsnummer, die wir auf dem Sitzungsobjekt mit getID() erfragen können, macht nicht bei jedem Servlet-Container eine vertrauensvolle Figur. Denn wenn wir diese erzeugen könnten, so wäre es möglich, unter einer fremden ID Aktionen durchzuführen. Es dürfte selbstverständlich sein, dass das vermieden werden muss. Unter der Servlet-API lässt sich die Berechnung der ID leider nicht anpassen, so dass wir auf eine gute Zufallsgenerierung vertrauen müssen. Diese ist bei Tomcat gegeben, denn die Methode generateSessionId() ruft eine Methode generateId() im SessionIdGenerator auf, die sehr gute Zahlen mit Hilfe der Klasse java.security.SecureRandom konstruiert.
Beispiel Ein paar IDs
h7pueqoxj1. vl7614oxj2, an8kmdoxj3, kzsy0poxj4 qgstxvoxj5, meay0toxj6, sdtltaoxj7, uy3n6uoxj8 D2thahoxj9, ppg4vroxja |
Die ID besteht aus sechs Zufallszeichen, drei mit der aktuellen Zeit kodierten Zeichen und einem Zähler, der bei 1 beginnt.
Bei anderen Servern bleibt nur die Lösung, auf HttpSession zu verzichten und mit Cookies eigene IDs zu verwalten.
| << zurück |
Copyright © Galileo Press GmbH 2004
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.