# session trackung auf einfacher web-site



## cable545 (11. Aug 2011)

hallo,
ich habe auf einer einfachen Internet Seite eine User Verwaltung implementiert. Man kann sich also als User anmelden, registrieren, eigene Daten löschen und abmelden. Die Userdaten werden in einer XML-Datei verwaltet. Nun möchte ich aber, wenn sich ein User erfolgreich anmeldet, dass eine session für diesen User erstellt wird. Also egal wo er sich auf der Web-Site nach der Anmeldung befindet, es soll immer eine entsprechende Info auf der Seite zu sehen sein, ob man nun angemeldet ist, oder nicht.  Meine An- bzw. Abmeldung wird über ein Servlet bewerkstelligt. 
Hat vielleicht jemand einen Tip wie ich das ganze angehe?


----------



## maki (11. Aug 2011)

In Java WebApps hat man immer eine HttpSession, einfach mal suchen & darüber lesen.


----------



## cable545 (11. Aug 2011)

ok, wenn sich der Benutzer angemeldet hat, wird ne session erstellt. Die Login Funktion läuft bei mir über ein Servlet. Wie kann ich denn jetzt auf einer normalen HTML Seite die Info ausgeben lassen ob der User angemeldet ist oder nicht?


----------



## maki (12. Aug 2011)

cable545 hat gesagt.:


> ok, wenn sich der Benutzer angemeldet hat, wird ne session erstellt.


Nein, eine HttpSession gibt es immer, die Frage ist, ob der User bereits angemeldet ist.

Kannst dir mal JAAS ansehen wenn es nur um die Authentifizierung geht.


----------



## cable545 (12. Aug 2011)

Ich steh gerade auf dem Schlauch.???:L Eigentlich will ich mir doch auf meiner Homepage nur dynamisch anzeigen lassen, ob ich angemeldet bin oder nicht. So wie es hier oben rechts im Forum auch ist.


----------



## maki (12. Aug 2011)

Wie gesagt, du solltest mehr lesen, dir fehlt das grundlegende Verständnis.

Eine Session ist immer vorhanden wenn sich ein Browser mit einem Java Webapp verbindet, unabhängig davon, ob der User angemeldet/authentifizert ist.


----------



## nillehammer (12. Aug 2011)

> Eine Session ist immer vorhanden wenn sich ein Browser mit einem Java Webapp verbindet,


Das stimmt so nicht. Erstmal ist keine Session vorhanden. Sie wird nur auf Anforderung der Webanwendung erzeugt. Z.B. durch so einen Code in der doGet-Methode des HttpServlet:

```
public void doGet(HttpServletRequest req, HttpServletResponse resp) {

  final HttpSession session = req.getSession(true); // true ist hier das Entscheidende
}
```
Was aber stimmt, ist dass das Vorhandensein einer Session (erstmal) noch nix darüber aussagt, ob ein Nutzer angemeldet ist, oder nicht. Im Gegenteil, es ist sogar gefährlich, nur auf das Vorhandensein der Session zu prüfen, weil Sessions gerne mal versehentlich erzeugt werden.

Ich würde in Deiner LoginPage eine Session erzeugen und ein UserData Objekt in die Session speichern, das z.B. den Nutzernamen enthält. In dem Code, der den Nutzernamen oben rechts anzeigt, liest Du diese Daten aus der Session dann aus.

In dem Code, der prüft, ob man angemeldet ist, prüfst Du erst auf das Vorhandensein einer Session und, wenn eine vorhanden ist, dann darauf, ob ein UserData Objekt in der Session gespeichert ist.


----------



## maki (12. Aug 2011)

> Das stimmt so nicht. Erstmal ist keine Session vorhanden. Sie wird nur auf Anforderung der Webanwendung erzeugt. Z.B. durch so einen Code in der doGet-Methode des HttpServlet:


Das ist so leider nicht ganz richtig nillehammer.
Der Code den du zeigst erzeugt explizit eine neue session, d.h. aber nicht das vorher keine vorhanden war, einfach mal testen 

Der Servletcontainer braucht sessions um den Client zu indentifizieren, erzeugt werden die Session zwar nicht immer, spätestens aber dann wenn "man" eine braucht. Gut zu sehen in JSPs, diese erzeugen autom. eine falls keine vorhanden ist, schliesslich hat jede JSP zugriff auf das implizite Session Objekt, also wird in JSPs immer eine neue angelegt wenn keine vorhanden war. Bei Servlet kann man zwar besser eingreifen, aber auch da gilt: Wenn ein benötigt wird und keine vorhanden ist, wird eine erzeugt.
Eine reine HTML Seite zB. erzeugt nicht automatisch eine Session wenn sie vom Tomcat serviert wird.

Beim Rest stimme ich dir natürlich voll zu


----------



## nillehammer (12. Aug 2011)

> Der Code den du zeigst erzeugt explizit eine neue session, d.h. aber nicht das vorher keine vorhanden war, einfach mal testen


Gut, da habe ich missverständlich ausgedrückt. Es hätte heißen müssen: Der von mir gepostete Code eine erzeugt Session, wenn noch keine vorhanden ist oder liefert die bereits vorhandene Session zurück.



> Der Servletcontainer braucht sessions um den Client zu indentifizieren, erzeugt werden die Session zwar nicht immer, spätestens aber dann wenn "man" eine braucht.


Genau, aber, dass man eine braucht, muss man ihm "sagen". *Zum Beispiel* mit dem von mir geposteten Code. Möglichkeiten, die Erzeugung einer Session zu verlangen gibtes natürlich noch viele andere. Das ist auch der Grund, warum sie vielfach "aus Versehen" erzeugt werden. Am Ende ist es aber immer die Webanwendung, die die Erzeugung der Session antriggert. Der Container macht das nie von alleine.



> schliesslich hat jede JSP zugriff auf das implizite Session Objekt, also wird in JSPs immer eine neue angelegt wenn keine vorhanden war.


Ja, aber nur in JSPs, die die auch tatsächlich auf die Session zugreifen und auch erst, wenn der Nutzer eine solche JSP aufruft. Z.B. wenn sie sowas hier enthält:
[XML]
<jsp:useBean id="userBean" scope="session" class="MeineUserBeanKlasse"/>
[/XML]
JSPs die nicht auf die (implizite) Session zugreifen, führen nicht dazu, dass eine erzeugt wird.


> Bei Servlet kann man zwar besser eingreifen, aber auch da gilt: Wenn ein benötigt wird und keine vorhanden ist, wird eine erzeugt.


Hier schreibst Du es jetzt so, wie es richtig ist. Das heißt nämlich im Umkehrschluss, dass wenn keine benötigt wird, auch keine erzeugt wird. Was wiederum heißt, dass eben nicht immer eine erzeugt wird, wenn sich ein Browser mit einem Java Webapp verbindet.


----------



## cable545 (12. Aug 2011)

nillehammer hat gesagt.:


> Ich würde in Deiner LoginPage eine Session erzeugen und ein UserData Objekt in die Session speichern, das z.B. den Nutzernamen enthält.


yap, genau so hab ich das gemacht


nillehammer hat gesagt.:


> In dem Code, der den Nutzernamen oben rechts anzeigt, liest Du diese Daten aus der Session dann aus.


Und genau das ist jetzt mein Problem. Ich weiß nicht wie der Code aussehen soll, der oben rechts den Nutzername, oder wie auch immer, anzeigt. Denn ich hab ja die Homepage an sich nur im stinknormalen HTML geschrieben.


----------



## mjustin (14. Aug 2011)

Wenn die (statische) HTML Seite die Logindaten anzeigen soll, wäre - Javascript vorausgesetzt) eine Lösung mit einer Bibliothek wie jQuery machbar.

Mit jQuery.get() (jQuery.get() – jQuery API) kann ein Element der Seite dynamisch um HTML Code erweitert werden.

Im OnLoad des Dokuments wird dazu ein Servlet aufgerufen, das die Sessiondaten in ein HTML Tag umwandelt (z.B. <p>Eingeloggt als usertest</p>).

Voraussetzung ist, dass jQuery das Sessioncookie an den Server übermittelt. Läßt sich aber mit wenig Code schnell testen.


----------



## JanHH (14. Aug 2011)

Irgendwie wäre die Info, wie Du die HTML-Seiten erzeugst, ganz sinnvoll. Also ich mein, man hat ja immer irgendeine Technologie zum Erzeugen von dynamischen HTML-Seiten, und sei es fest vercodeteter HTML-Code der vom Servlet erzeugt wird. Wie machst Du das? Deine Seiten scheinen ja auch dynamisch zu sein, ist ja auch logisch irgendwie zwingend notwendig bei Web-Anwendungen.

Wenn Dir das alles nix sagt, mal in JSF einarbeiten!?


----------



## mjustin (14. Aug 2011)

Hier ist ein Beispiel für den Header der statischen HTML Datei:


```
<head>
        <title>ActiveMQ 5.5 and Tomcat 7 example application</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
        <script type="text/javascript">
            function getMsg() {
                $.get('./getlogindata', function(data) {
                    $('body').append(data);           
                }, 'html');
            }
        </script>
    </head>
```

jQuery ruft in der Funktion getMsg über $.get die Servlet-URL getlogindata auf, und diese liefert ein HTML Fragment das dann in diesem Beispiel an das Ende des Dokuments eingefügt wird.

Die getMsg Funktion kann über <body onLoad="getMsg();"> aufgerufen werden.


----------



## cable545 (14. Aug 2011)

Die Homepage ist an sich nur ein Grundgerüst, in welches ich eine Userverwaltung einbauen sollte. Also "Anmeldung", "Abmeldung", "Registrierung" und "Löschen" von Usern. 
Die Seite an sich hat weder irgendeinen Inhalt noch irgendeinen Sinn. 
Es ging meinem Prof. nur darum eine Userverwaltung mittels JAXB, Servlets bzw. JSP zu entwickeln. Nun hab ich mir aber überlegt, ohne das es Bestandteil der Aufgabe ist, diesen dynamischen Inhalt, also die Info ob man angemeldet ist oder nicht, oben rechts anzeigen zu lassen. 

Ich werd das mal ausprobieren mit JavaScript und der jQuery Bibliothek. Muss mich da mal kurz reinlesen. Aber danke für den Tip:toll:


----------



## JanHH (14. Aug 2011)

Also die javascript-Version finde ich eher unnötig kompliziert. Eigentlich macht die ganze Aufgabenstellung keinen Sinn, wenn man nicht mit irgendeiner konkreten View-Technologie arbeitet, so simpel diese auch sein mag.

Dynamische Web-Seiten MÜSSEN irgendwie erzeugt werden, und die Information, ob man eingeloggt ist, und wenn mit welchem Namen, in die Seite einzubauen, ist trivial. Da mit jquery anzufangen kommt mir total übertrieben vor.


----------



## cable545 (14. Aug 2011)

Das ist einfach ne Aufgabenstellung in einem Kurs "Web-Programmierung". Ne einfache Webseite per HTML welche dann eine Userverwaltung nutzt, welche mit JSP und Servlets implementiert ist. 

Das mit diesem User-Login-Status war nur Interesse meinerseits. Wenn dieses Thema für Dich trivial erscheint ist das schön, für mich als Neuling, im Thema Web Programmierung, ist es das nicht. Ich bin Dir jedoch sehr dankbar über einen anderen Lösungsvorschlag


----------



## JanHH (14. Aug 2011)

Naja wenn die Seiten per JSPs erzeugt werden, kann man den login-Status da ja einfach per jsp-Scriplet reinschreiben.. wobei ich noch nie direkt mit JPSs gearbeitet hab, aber trivial ist es definitiv. Halt so die JSP-Grundlagen.


----------



## JanHH (14. Aug 2011)

Also, im Session Scope des Servlets fliegt halt eine Bean rum namens "loginStatus" (oder so), die das Servlet da platziert nach dem Login-Versuch. Diese Bean enthält Login-Status und Username. In der JSP kann man dann mit jsp:useBean auf diese Bean zugreifen. Oder so in etwa..

Ist auch fürs allgemeine Verständnis gut, denn quasi alle modernen java-Frameworks für Webanwendungen bauen auf irgendwelchen Beans, die in irgendwelchen Scopes sind, auf..


----------

