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



  • Ich benutze Tomcat mit GWT. Und meine Website verwendet keine Cookies (also kein Session-Objekt) sondern ich 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. Nun 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.

    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 benutzet der Nutzer die Seite nicht mehr.

    Wie kann man sowas realisieren?



  • Hallo!

    Zu diesem Zweck gibt es den cron-Daemon.
    Alternativ kannst du die Überprüfung auch bei jeder relevanten Anfrage an den Server durchführen, falls davon nicht gar zu viele kommen.

    Gruß,
    yanni



  • cron Dämon? Nur damit mir das klar ist: Du meinst nicht den crond Prozess der unter Unix normalerweise läuft?



  • Doch, genau den meint er.



  • cron-Daemon ist natürlich Blödsinn. Session-Handling macht dein Web-Container vollautomatisch. Warum glaubst du, dass er das nicht leisten kann?



  • Am Anfang hatte ich immer das Session Objekt benutzt. Allerdings hat mir ein Forumsmitglied (in diesem) Forum die Methode mit dem Hidden Input Feld empfohlen und vom Gebrauch des Session Objekts abgeraten. Deshalb habe ich die gesamte WebApp so umgestellt, dass sie theoretisch ohne Sessions auskommt.

    Nun bin ich doch verwirrt. Sollte man Session Objekte benutzen oder nicht?



  • Die eigentliche Problematik (und eine mögliche Lösung) ist hier ausführlich und verständlich beschrieben.

    Viel Spaß beim lehrreichen Schmökern ...

    PS: Ich würde auf Session-Objekte/Cookies verzichten. Ob ein Benutzer noch auf deiner Seite ist, verrät dir dieser Ansatz eh nicht.



  • Ja, aber das Problem ist doch, wie stelle ich es an, dass ein Benutzer aus der Hashmap im Server entfernt wird. Bei einem Session-Objekt würde das automatisch funktionieren. Wie geht das ohne Session-Objekt?



  • tomatensalat schrieb:

    Ja, aber das Problem ist doch, wie stelle ich es an, dass ein Benutzer aus der Hashmap im Server entfernt wird. Bei einem Session-Objekt würde das automatisch funktionieren. Wie geht das ohne Session-Objekt?

    Hättest du den verlinkten Artikel aufmerksam gelesen, hättest du diese Frage nicht mehr gestellt, weil du dort die Antwort findest.

    Hier aber soviel: Ohne asynchrone Datenübertragung (bei genauer Betrachtung also ohne JavaScript) bleibt jeder normale HTML-Client ein zustandsloses Individuum.



  • schmidt-webdesign.net schrieb:

    Hättest du den verlinkten Artikel aufmerksam gelesen, hättest du diese Frage nicht mehr gestellt, weil du dort die Antwort findest.

    Danke für den Link, aber die Antwort kann ich in dem Wikipedia-Artikel nicht finden. Du musst mir schon genau sagen in welchem Abschnitt das stehen soll.

    Was ich bisher noch nicht verstehe: Welche Gründe sprechen eigentlich gegen das Session-Objekt? Das Cookie Argument kann es nicht sein, dafür gibt es ja URL-Rewriting.



  • tomatensalat schrieb:

    Danke für den Link, aber die Antwort kann ich in dem Wikipedia-Artikel nicht finden. Du musst mir schon genau sagen in welchem Abschnitt das stehen soll.

    Nix Abschnitt - für das Verständnis müsstest du schon den ganzen Artikel lesen.

    tomatensalat schrieb:

    Was ich bisher noch nicht verstehe: Welche Gründe sprechen eigentlich gegen das Session-Objekt? Das Cookie Argument kann es nicht sein, dafür gibt es ja URL-Rewriting.

    Nun hör' endlich auf mit dem Unsinn (wo immer du ihn her hast)! Weder Session-Objekt noch Cookies liefern verbindliche Aussagen, ob ein User sich noch auf deiner Seite befindet.



  • Na also ich denke, dass ich sehr wohl den Ajax Artikel verstanden habe. Meine Webapp ist eine 100%ige Ajaxseite, ansonsten bin ich wohl komplett doof. Ich verstehe aber immer noch nicht in welchem Zusammenhang das mit meinem Problem steht. Wenn Du aber immer nur drei Wörter als Antwort schreibst kann ich leider auch nicht verstehen was Du meinst.

    Des weiteren kann man sehr wohl feststellen ob ein Nutzer die Seite noch nutzt. Ist die Session abgelaufen, dann kann man davon ausgehen, dass der Nutzer nicht mehr auf der Seite ist. Von daher ist Deine Aussage wohl falsch. Übrigens gilt die Aussage Session != Cookie !!! Lesen kannst Du ja ganz gut: http://java.sun.com/webservices/docs/1.6/api/javax/servlet/http/HttpSession.html

    Außerdem habe ich auf Deiner HP gesehen, dass Du in Dienste in ASP anbietest. Dir ist schon klar, dass ich hier von Java/GWT/Tomcat rede?

    Du konntest mir bisher nicht plausibel erklären warum das Session-Objekt nicht verwendet werden soll. Außer Session = Böse kam bisher nix rüber.



  • Grundsätzliches zum Thema steht hier.

    Deine Frage war: Wie feststellen, ob ein Benutzer noch auf meiner Seite ist?

    Meine Antwort: Nicht mit Session-Objekten oder Cookies. Allenfalls mit Javascript. Und wenn es dein Benutzer nicht zulässt gar nicht. Basta!



  • schmidt-webdesign.net schrieb:

    Und wenn es dein Benutzer nicht zulässt gar nicht. Basta!

    Ich denke das dürfte ihm klar sein, "tomatensalat" will ja auch keine perfekte Lösung, sondern nur eine ausreichend gute. Und ich denke, dass Sessions ausreichend gut sind, denn wenn die Session abgelaufen ist, kann er auch guten Gewissens annehmen, dass der Benutzer nicht mehr auf seiner Seite ist. Wenn der doch noch drauf ist, wird's nicht weiter schlimm sein, ist dann halt wie neu draufgegangen.



  • Okay, also der Wikipedia Artikel über Sessions liefert auch absolut keinerlei Begründung dafür auf Session-Objekte zu verzichten. Ganz ehrlich, ich weiß wirklich nicht was Du mir zu erklären versuchst.

    Es gibt definitiv KEINEN Grund auf Sessions zu verzichten. Ganz im Gegenteil man sollte sie sogar verwenden. Ansonsten labern dann ziemlich viele Experten Blödsinn, denn die empfehlen wirklich ALLE das Session-Objekt zu verwenden.

    Badestrand hat jedenfalls verstanden worauf ich hinaus will. 👍



  • schmidt-webdesign.net wollte sagen, dass die Existenz einer Session nicht bedeutet, dass der User tatsächlich auf der Seite rumlungert (diese im Browser betrachtet). Die Session lebt nach der letzten Server-Client-Übertragung eine vorgegebene Zeit lang, ganz unabhängig davon, ob der User die Seite geschlossen hat oder nicht. Wenn nun diese Session-Lebenszeit auf 30 Minuten gesetzt wurde, kann ich als User nach drei Sekunden die Seite schließen, gelte aber weitere 29 Minuten, 57 Sekunden auf dem Server als online.

    Gruß



  • Hallo,

    zumal die Session so lange weiter läuft wie das Browserfenster geöffnet ist. Der Nutzer kann also deine Seite besuchen eine Session starten, dann die Seite wechseln und aber immernoch eine aktive Session haben. Mit ein bißchen basteln kannst du das aber über den onunload-event im Body regeln.

    mfg, Micha



  • RandomAccess85 schrieb:

    zumal die Session so lange weiter läuft wie das Browserfenster geöffnet ist. Der Nutzer kann also deine Seite besuchen eine Session starten, dann die Seite wechseln und aber immernoch eine aktive Session haben. Mit ein bißchen basteln kannst du das aber über den onunload-event im Body regeln.

    Sorry, aber das ist - zumindest vom Kontext her - völlig irrelevant. Clientseitig besteht die Session womöglich solange, wie der Client nicht geschlossen wurde ("Browser beendet"), aber davon weiß der Server herzlich wenig. Das serverseitige Session-Timeout bezieht sich immer auf den letzten Zugriff. Wenn der Benutzer die Seite aufruft und eine 30min-Session begonnen wird, ist die Session - so der Client keine weitere Verbindungen aufbaut, die die Session erneuern - nach 30min beendet; auch wenn der Client noch vierundziebig Tage länger ununterbrochen läuft.

    Eine Session bietet einen guten Anhaltspunkt, festzustellen, ob ein Besucher nicht mehr auf der Webseite verweilt, der es früher einmal tat. Denn die Wahrscheinlichkeit, dass er eine Session anfangs ankzeptierte und sie dann ganz plötzlich ablehnt ist relativ gering. Verlässlich oder gar Zuverlässig ist die Angabe aber nicht. Eine solche kann es nicht geben, und i.d.S. sind auch sämtliche Javascript-Frickeleien, mit denen es unter X Bedingungen ein wenig genauer aber keinen Deut zuverlässiger bestimmt werden kann, völlig sinnfrei.

    Es gibt auch keinen vernünftigen Grund, sekunden- oder auch nur minutengenau wissen zu müssen, wann der Benutzer tatsächlich praktisch die Seite verlassen hat. Zumindest ist mir noch nie einer untergekommen, der nicht unnötige Spielerei war.



  • blobb schrieb:

    Es gibt auch keinen vernünftigen Grund, sekunden- oder auch nur minutengenau wissen zu müssen, wann der Benutzer tatsächlich praktisch die Seite verlassen hat. Zumindest ist mir noch nie einer untergekommen, der nicht unnötige Spielerei war.

    ...ziemlich blind meiner Meinung nach!

    Und selbst wenn es nur eine Spielerei wäre, gibt es keinen Grund es nicht anzuwenden.



  • schmidt-webdesign.net schrieb:

    Meine Antwort: Nicht mit Session-Objekten oder Cookies. Allenfalls mit Javascript. Und wenn es dein Benutzer nicht zulässt gar nicht. Basta!

    👍
    Es gibt keine 100% zuverlässige Methode um festzustellen, ob ein Benutzer gerade jetzt tatsächlich noch auf der Seite ist oder nicht. Aber je nachdem was man benötigt, kann der ein oder andere Ansatz ja schon reichen.


Log in to reply