# Wie feststellen, ob ein Benutzer noch auf meiner Seite ist



## toom_ (26. Okt 2008)

Ich benutze für meine Website keine Cookies sondern merke mir eine eigens generierte Id für jeden angemeldeten Benutzer in einem hidden-Feld. Das wird bei jeder Serveranfrage mitgesendet. Auf dem Server ist im ServletContext eine Hashmap in der alle Daten des zur Zeit angemeldeten Benutzer gespeichert sind. Das funktioniert soweit ganz gut. Leider möchte ich irgendwie auch feststellen können, wann ein Benutzer meine Seite nicht mehr benutzt, damit ich diesen Benutzer aus der Hashmap entfernen kann. Weiß jemand mit welcher Methode ich das überprüfen kann, bzw. hat jemand einen Vorschlag wie man das realisieren könnte?


----------



## gex (26. Okt 2008)

Hallo toom_



> Auf dem Server ist im ServletContext eine Hashmap in der alle Daten des zur Zeit angemeldeten Benutzer gespeichert sind.


Klingt mir eigentlich so ziemlich nach einem selbst gebauten "Session"-Scope?
Oder meinst du etwas anderes?

Falls nicht:
Du beziehst das Session Objekt mit

```
request.getSession();
```

Und links:
http://java.sun.com/javaee/5/docs/tutorial/doc/bnafo.html
http://java.sun.com/javaee/5/docs/api/javax/servlet/http/HttpSession.html


----------



## toom_ (26. Okt 2008)

Das was Du geantwortet hast mache ich gerade nicht. Ich dachte das wäre in meiner Frage deutlich formuliert. Nochmal: ich benutze keine Cookies und folglich auch kein Session-Objekt. 

Meine Frage nochmal: Wie stellt man fest, dass ein Benutzer die Seite nicht mehr benutzt?


----------



## Gast (26. Okt 2008)

Noch ein Nachtrag: Mir ist prinzipiell klar, dass das der Webcontainer nicht leisten kann. Deshalb bräuchte ich sowas wie einen "Dämon" der jede Minute die Hashmap durchgeht und schaut wie lange auf jeden Eintrag nicht mehr zugegriffen wurde. Wurde auf einen Eintrag in der Hashmap zB 30Min lang nicht mehr zugegriffen, dann ist der Nutzer nicht mehr die Seite am nutzen. Wie kann man sowas realisieren?


----------



## SlaterB (26. Okt 2008)

das ist doch kein technisches Problem,

du kannst entweder auf dem Computer des Clients einen Trojaner installieren, der genau prüft, was da so wer macht,
wann der Browser ausgeschaltet wird,
musst dann aber immer noch mit Möglichkeiten wie Strom-/ Netzwerkausfall umgehen können,
also am besten eine eigene Stomversorgung + weltweites Satellitennetz dazu,

oder festlegen, dass nach x Min. ohne neue Anfrage nix mehr los

ein Logout-Button ist natürlich recht elegant, dann sagt dir der User, wann besonders doll Schluss ist

----


edit:
> Wie kann man sowas realisieren?

Thread oder Timer in Java, Zeitstempel


----------



## maki (26. Okt 2008)

> Das was Du geantwortet hast mache ich gerade nicht. Ich dachte das wäre in meiner Frage deutlich formuliert. Nochmal: ich benutze keine Cookies und folglich auch kein Session-Objekt.


Deine Aussage ist an sich schon falsch, man braucht keine Cookies für Sessions, letzteres hat man immer.



> Meine Frage nochmal: Wie stellt man fest, dass ein Benutzer die Seite nicht mehr benutzt?


Am Session timeout, HTTP ist zustandslos.


----------



## gex (26. Okt 2008)

> Das was Du geantwortet hast mache ich gerade nicht. Ich dachte das wäre in meiner Frage deutlich formuliert. Nochmal: ich benutze keine Cookies und folglich auch kein Session-Objekt.


(Btw: es ginge mittels URL-Rewriting auch ohne Cookies)

Aber dann schau dir doch mal Quartz an, dort kannst du dir solche wiederkehrenden Tasks
anlegen.
http://www.opensymphony.com/quartz/

Dann machst du einfach in dein Objekt in der HashMap einen Timestamp rein, der die letzte Zugriffszeit einthält
(die du natürlich nachführst), dann kann dein Job auf dieses Property und deinem definierten Timeout testen.


----------



## SlaterB (26. Okt 2008)

> man braucht keine Cookies für Sessions, letzteres hat man immer. 

ohne Cookies oder einem anderen automatischen Verfahren gibts auch keine automatische HTTPSession??


----------



## maki (26. Okt 2008)

> ohne Cookies oder einem anderen automatischen Verfahren gibts auch keine automatische HTTPSession??


URL rewriting.

Cookies sind zwar zu bevorzugen, aber es geht auch ohne.

Ansonsten, ohne Cookies und ohne URL rewriting, würde ich mir genau überlegen ob man da nicht auf dem Holzweg ist.
Gibt dann zwar immer noch sessions, aber eben für jeden aufruf eine neue


----------



## SlaterB (26. Okt 2008)

wurde ja schon genannt und du kannst nun nicht unterstellen, dass das der Originalposter (vielleicht unwissentlich) aktiviert hat,
also gibts auch keine Session (anzunehmenderweise), 

ok, bis auf die neue pro Aufruf, nützlich


----------



## maki (26. Okt 2008)

SlaterB hat gesagt.:
			
		

> wurde ja schon genannt und du kannst nun nicht unterstellen, dass das der Originalposter (vielleicht unwissentlich) aktiviert hat,
> also gibts auch keine Session (anzunehmenderweise),
> 
> ok, bis auf die neue pro Aufruf, nützlich


Wenn Cookies nicht aktiviert sind, geift der Container automatisch auf URL rewriting zurück.

Der TS hat Servlets nicht/falsch verstanden und nun bastelt er für alles seine eigene, u.U. minderwertige Lösung 

Man kann übrigens auch über SSL Sessions gehen, aber über irgendetwas muss man nehmen und die Standardsession nutzen, kann ja nicht sein das man aus unwissenheit die halbe API selbst nochmal schreibt.

Denn wenn dem Standardweg (der richtige weg) begangen wird stellen sich viele Fragen gar nciht bzw. sind sehr einfach zu beantworten, in diesem Fall: javax.servlet.http.HttpSessionListener


----------



## toom_ (26. Okt 2008)

@gex: Vielen Dank für den Hinweis. Das wäre genau das was ich suche.

@maki:
In einem anderen Forum hat mir jemand (ich denke mal erfahren, hat nämlich eine Firma die Internetseiten baut) davon abgeraten das Session-Objekt zu nutzen und statt dessen eine zufällige Nummer als BenutzerId bei jedem Request mitzuschicken und dann in einem Hidden Input Feld zu speichern. Die eigentlichen Nuterdaten werden auf dem Server gespeichert und mit der BenutzerId identifiziert.
Im Grunde hatte ich die Applikation genauso mit Session-Objekt aufgezogen, dann aber umgebaut nachdem ich die Empfehlung bekam. Das mit dem URL-Rewriting wusste ich leider nicht. Wo könnten dann Probleme auftreten, wenn man ein Session-Objekt verwendet?


----------



## maki (26. Okt 2008)

> In einem anderen Forum hat mir jemand (ich denke mal erfahren, hat nämlich eine Firma die Internetseiten baut) davon abgeraten das Session-Objekt zu nutzen und statt dessen eine zufällige Nummer als BenutzerId bei jedem Request mitzuschicken und dann in einem Hidden Input Feld zu speichern.


Höre ich zum ersten mal.


----------



## toom_ (26. Okt 2008)

Also gibt es eigentlich keine Alternative zum Session-Objekt?


----------



## maki (26. Okt 2008)

toom_ hat gesagt.:
			
		

> Also gibt es eigentlich keine Alternative zum Session-Objekt?


Wieso denn?

Was stimmt denn nicht mit der HttpSession ?


----------

