Die Session zum Speichern clientbezogener Informationen nutzen
Die Session ist ein Konstrukt, dass es uns ermöglicht, Besucher-spezifische Informationen über mehreren Seitenaufrufe zu halten.
Dies wird erreicht, indem der Server Informationen unter Bezug auf eine bestimmten Session-ID, das ist eine unverwechselbare Kennung, abspeichert. Diese Kennung trägt den Namen JSESSIONID und hat beispielsweise die Form: jsessionid=567FB65D0468447EB04E5440D0238E67.
Da der Server die Verbindung zum Client verliert, sobald er den Request abgearbeitet hat, ist es wichtig, dass der Client (Browser) diese Session-ID beim nächsten Request wieder an den Server schickt, damit er wiedererkannt wird. Das wird erreicht, indem der Server automatisch ein Cookie mit eben diesen Information setzt. Bei jedem Request sendet der Browser dann das Cookie, das der Server automatisch auswertet und uns Programmierern die clientbezogenen Informationen zur Verfügung stellt.
Problematisch wird es, wenn der Browser keine Cookies akzeptiert. In diesem Fall müssen wir eine andere Möglichkeit finden, die Session-ID zu transportieren. Das geschieht, indem wir die Session ID mit der aufgerufenen URL senden lassen. Der Server ist dann auf unsere Unterstützung angewiesen, indem wir dafür sorgen, dass die Session ID auf jeden Link geschrieben wird (sog. URL rewriting.).
Auch die Session ist in JSP in einem Objekt gekapselt und steht in der Seite ohne weiteres unter dem Namen session zur Verfügung. Sie ist vom Typ: javax.servlet.http.Session. Daten, die Sie auf der Session speichern wollen, müssen ebenfalls Objekte sein. Sie müssen das Interface java.io.Serializable implementieren, das bedeutet, das Objekt hat eine Form, die gespeichert und wiederhergestellt werden kann. Eine java.net.URL ist beispielsweise ein serialisierbares Objekt, weil es im wesentlichen die Information einer URL (.z.B. http://java.sun.com) enthält, die in eine Datei geschrieben werden kann. Eine java.net.URLConnection dagegen ist nicht serialisierbar, da die Verbindung zu einer URL nicht gespeichert und wieder geladen werden kann. Vielmehr wird sie irgendwann beispielsweise vom Server geschlossen und ist weg. Um sie wiederzubekommen, muss sie neu erzeugt werden.
Objekte werden auf der Session unter einem Namen gespeichert. Sie heißen "Attribute" der Session:
Code: /bsp/kap2/session_simple.jsp
<%
// Objekt erzeugen.
java.util.Properties client=new java.util.Properties();
// Objekt mit Daten f?llen
client.setProperty("firstname","Hans");
client.setProperty("lastname","Wurst");
// Name des Sessionobjekts
String scopeName="myClient";
// Objekt auf der Session speicher
session.setAttribute(scopeName,client);
// Objekt aus der Session holen
java.util.Properties aClient=
(java.util.Properties)session.getAttribute(scopeName);
out.println("In der Session:");
out.println(aClient);
// Objekt aus der Session entfernen
session.removeAttribute(scopeName);
out.println("Und wieder weg:");
out.println(session.getAttribute(scopeName));
%>
Sie sollten die Session immer dann nutzen, wenn die Formulardaten über mehrere Seiten erheben oder Userinformationen auf mehreren Seiten benötigen (Browsertyp, Flash-Plugin, User eingeloggt).
Das folgende Beispiel zeigt, wie Sie die Session nutzen können, um einen geschützten Bereich aufzubauen. Im geschützten Bereich überprüfen Sie, ob das Session Objekt vorhanden ist:
Session Objekt überprüfen
// Überprüfen Sie, ob das Session Objekt vorhanden ist
// also nicht null ist
if (session.getAttribute("userName")==null ) {
// Wenn es nicht da ist, schicken Sie den User auf die Login Seite
response.sendRedirect("session_login.jsp");
} else {
Ist das Session-Objekt nicht vorhanden, senden Sie einen Redirekt auf die Login-Seite, wo Sie ein handelsübliches Formular zur Eingabe von Username und Passwort anbieten. Überprüfen Sie die gesendeten Angaben und setzen Sie das Session Objekt, wenn die Eingabe gültig ist:
Code: /bsp/kap2/session_login.jsp
<%
// Prüfen, ob username und password im request sind und kein leerer String sind.
// Bitte beachten: Inputfelder werden immer gesendet, auch wenn sie keine Zeichen
// enthalten.
if (request.getParameter("username") != null && request.getParameter("username").length()>0 ) {
if (request.getParameter("password") != null && request.getParameter("password").length()>0 ) {
// ToDo: Check username and password against database
// Session Objekt setzen; damit ist der User eingeloggt
session.setAttribute("userName",request.getParameter("username"));
}
} else if (request.getParameter("logout")!=null ) {
session.removeAttribute("userName");
}
if (session.getAttribute("userName")==null) {
%>