Frank: Funktionen beim Schließen des Fensters ausführen

Hallo zusammen!

Gibt es eine Möglichkeit, eine Funktion beim Schließen des Browserfensters automatisch auszuführen?

Problem ist folgendes: Ich habe ein PHP-Skript, mit dem sich mehrere Benutzer von mehreren Rechnern mit Hilfe einer Sessionverwaltung gleichzeitig einloggen können.
Das ganze funktioniert auch solange fehlerfrei, so lange sich der Benutzer immer ordnungsgemäß abmeldet bevor er das Browserfenster schließt. Tut er das jedoch nicht, kommt es leider zu einem inkonsistenten Zustand wenn das Fenster geschlossen wird und beim nächsten Öffnen ein anderer Benutzer eingeloggt wird. Dann sind nämlich 2 Benutzer gleichzeitig angemeldet.

Ich dachte, man könnte das dadurch umgehen, dass der Benutzer beim Schließen des Fensters automatisch ausgeloggt wird, weiß aber nicht, ob so etwas überhaupt möglich ist.
Hat da jemand eine Idee?

Danke schonmal!

Gruß,
Frank

  1. Hi,

    Das ganze funktioniert auch solange fehlerfrei, so lange sich der Benutzer immer ordnungsgemäß abmeldet bevor er das Browserfenster schließt. Tut er das jedoch nicht, kommt es leider zu einem inkonsistenten Zustand wenn das Fenster geschlossen wird und beim nächsten Öffnen ein anderer Benutzer eingeloggt wird. Dann sind nämlich 2 Benutzer gleichzeitig angemeldet.

    demnach ist Dein serverseitiges Konzept kaputt. Repariere es, anstatt die Symptome mit Lacksprühfarbe schönzufärben.

    Ich dachte, man könnte das dadurch umgehen,

    Nein, kann man nicht. Nichts, was den Client anbelangt, ist nämlich verlässlich. Was immer Du hier tust, wird das Problem also nicht beheben, sondern höchstens unter Laborbedingungen verschleiern.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi,

      Das ganze funktioniert auch solange fehlerfrei, so lange sich der Benutzer immer ordnungsgemäß abmeldet bevor er das Browserfenster schließt. Tut er das jedoch nicht, kommt es leider zu einem inkonsistenten Zustand wenn das Fenster geschlossen wird und beim nächsten Öffnen ein anderer Benutzer eingeloggt wird. Dann sind nämlich 2 Benutzer gleichzeitig angemeldet.

      demnach ist Dein serverseitiges Konzept kaputt. Repariere es, anstatt die Symptome mit Lacksprühfarbe schönzufärben.

      Das würd ich gerne machen, allerdings weiß ich nicht wie. Das Problem mit Sessions ist, dass die Zuordnung nicht immer vollständig nachvollziehbar ist. Ich könnte beispielsweise etwas einbauen, was beim Einloggen eines Benutzers alle anderen Benutzer mit der gleichen IP-Adresse ausloggt.
      Nur wenn sich jemand einloggt, das Fenster einfach schließt, seine Internetverbindung trennt, wiederherstellt und nochmal am System einloggt, dann hat er eine andere IP-Adresse und eine andere Session. Ich sehe da keine Chance, herauszufinden, welcher Benutzer da vorher eingeloggt war und den entsprechend automatisch auszuloggen.

      1. Hallo Frank,

        demnach ist Dein serverseitiges Konzept kaputt. Repariere es, anstatt die Symptome mit Lacksprühfarbe schönzufärben.
        [...] Das Problem mit Sessions ist, dass die Zuordnung nicht immer vollständig nachvollziehbar ist.

        wieso nicht? Dein Client übergibt dir mit dem Request eine Session ID, sei es per Cookie oder URL-Parameter. Damit ist _dieser_ Client eindeutig identifizierbar.
        Und wenn einer mit einer ungültigen (oder abgelaufenen) Session ID ankommt, dann wird er eben freundlich zum Login komplimentiert und bekommt damit eine frische, gültige Session ID an die Backe geklebt.

        Ich könnte beispielsweise etwas einbauen, was beim Einloggen eines Benutzers alle anderen Benutzer mit der gleichen IP-Adresse ausloggt.

        Könntest du. Aber was soll der Unsinn? Wenn mehrere Leute aus einem Firmennetzwerk mit gemeinsamem Internet-Zugang unabhängig voneinander auf deine Seite zugreifen, willst du alle rausschmeißen, sobald sich ein Neuer einloggt? Nein!

        Nur wenn sich jemand einloggt, das Fenster einfach schließt, seine Internetverbindung trennt, wiederherstellt und nochmal am System einloggt, dann hat er eine andere IP-Adresse und eine andere Session.

        Ja natürlich. Und? Warum interessiert dich die IP?

        Ich sehe da keine Chance, herauszufinden, welcher Benutzer da vorher eingeloggt war und den entsprechend automatisch auszuloggen.

        Brauchst du doch nicht. Lass die Sessions, auf die du nicht mehr zugreifst, nach einer gewissen Zeit verfallen. Ob ein Benutzer sich korrekt ausgeloggt hat, ist doch belanglos - oder befürchtest du Session Hijacking?

        Schönes Wochenende,
         Martin

        --
        Gültig sind Frauen ab 16, wohlgeformt ab 160 Pfund.
          (Gunnar Bittersmann)
  2. Hallo,

    Gibt es eine Möglichkeit, eine Funktion beim Schließen des Browserfensters automatisch auszuführen?

    Im Prinzip onunload, aber dabei kannst du nicht sicher sein, dass der Code ausgeführt wird, weil du damit das Schließen des Fensters nicht verzögern oder blocken kannst. Geeigneter ist onbeforeunload, aber halt auch nicht zuverlässig.

    Ich dachte, man könnte das dadurch umgehen, dass der Benutzer beim Schließen des Fensters automatisch ausgeloggt wird, weiß aber nicht, ob so etwas überhaupt möglich ist.

    Nicht wirklich.

    Du kannst in manchen Browsern eine blockende Meldung anzeigen, wenn der Benutzer das Fenster schließt. Darin kannst du den Benutzer auffordern, manuell auszuloggen. Eventuell kannst du auch versuchen, per XMLHttpRequest o.ä. einen Logout herbeizurufen. Siehe dazu etwa http://forum.de.selfhtml.org/archiv/2005/8/t114087/#m726346.

    Wie schon gesagt wurde, du kannst damit den unerwünschten Fall nicht verhindern, sondern nur dessen Wahrscheinlichkeit senken.

    Mathias

    1. Im Prinzip onunload, aber dabei kannst du nicht sicher sein, dass der Code ausgeführt wird, weil du damit das Schließen des Fensters nicht verzögern oder blocken kannst. Geeigneter ist onbeforeunload, aber halt auch nicht zuverlässig.

      Weil es hier gerade passt: Opera führt onunload seit Version 9.21 nicht mehr aus, wenn ein URI manuell in die Adresszeile eingegeben wird (was wohl auch für die Auswahl von Bookmarks gelten wird). Siehe changelog.

      Roland

      --
        ,--./,-.
       /        \ |  Switch  |
       \        /
        `._,._,'
  3. Huhu!

    Gibt es eine Möglichkeit, eine Funktion beim Schließen des Browserfensters automatisch auszuführen?

    [...]

    Ich dachte, man könnte das dadurch umgehen, dass der Benutzer beim Schließen des Fensters automatisch ausgeloggt wird, weiß aber nicht, ob so etwas überhaupt möglich ist.
    Hat da jemand eine Idee?

    Ja, das geht. Eingeschränkt. Aber es geht. Ich arbeite auch zur Zeit an genau demselben Problem. Die Usersession soll bei Schließen des Browserfensters auf dem Server beendet werden. Dazu muss ich per GET einen Parameter an den Server schicken. Ich mache das z.Zt mit Ajax:

    window.onbeforeunload = function () {
       var closeThis = CloseWindow();
    };

    function CloseWindow() {
       // Noch fix irgendwelche Bedingungen pruefen
       // da onbeforeunload auch bei Reload oder target=_top gefeuert wird
       var logoff = callLogoffByAjax(strUrl);
    }

    function callLogoffByAjax(was){
       // funktioniert bei IE und Firefox (Win XP) und Firefox (Mac Os X);
       //Safari (Mac Os X) blieb wg. onbeforeunlaod ungetestet
       if(was == "" || !was){
          return false;
       }
       var strUriLogoff = was;
       var xmlHttp = null;
       // Handler fuer die verschiedenen Browser bestimmen u. instantiieren:
       // Mozilla, Opera, Safari sowie Internet Explorer 7
       if (typeof XMLHttpRequest != 'undefined') {
          xmlHttp = new XMLHttpRequest();
       }
       if (!xmlHttp) {
           // Internet Explorer 6 und aelter
           try {
               xmlHttp  = new ActiveXObject("Msxml2.XMLHTTP");
           } catch(e) {
               try {
                   xmlHttp  = new ActiveXObject("Microsoft.XMLHTTP");
               } catch(e) {
                   xmlHttp  = null;
               }
           }
       }
       // Aufruf taetigen:
       if (xmlHttp) {
           xmlHttp.open('GET', strUriLogoff, true); // true=asynchroner Aufruf, false=synchroner Aufruf
           xmlHttp.send(null);
       }
    }

    onbeforeunload wird nicht auf dem Mac Os X im Safari ausgelöst, im IE schon. Auf Win XP mit FF 1.5 und IE 6 hat es funktioniert.
    Achtung: onebeforeunload wird auch ausgelöst bei Reload oder bei Links oder Formularen mit target=_top. Das musst du ggf. noch abfangen.
    Und nochmal aufpassen: du kannst nur Daten an die Domäne schicken, wo sich auch das Skript befindet.

    Viel Spaß!

    Liebe Grüße
    Anja  ;->