likeagenius: Beim schließen des Fenster Aktion ausführen

Guten Tag,

ich habe Folgendes Problem, In unserer Firma haben wir ein eigenes Programm, welches so Funktioniert das jeder User der eine Website betritt eine Lizenz vergibt, je nach Kunden kann diese begrenzt sein.

Die Lizenzen haben ein TimeOut, allerdings unterschiedlich je nach Kundenwunsch. (im Schnitt 30 Minuten) Das Problem hierbei ist, wenn der Kunde das Browser Fenster schließt und den Dialog bzw die Lizenz nicht frei gibt, bleibt diese solang existent bis der Timeout sie löscht.

Wenn alle Lizenzen vergeben sind, kann keiner mehr die Seite besuchen. Das hat unter anderem auch Sicherheitsgründe.

Nun wollten wir eine Funktion mit einbinden, welche diese Unmittelbar nach dem schließen des Fensters diese Freigibt.

Ich habe es mit onunload versucht ohne Erfolg und mit beforeUnload. Allerdings bei beforeUnload erhalte ich einen Alert, welcher aber nach klicken des verlassen Buttons keine Funktion ausführt..

Natürlich gibt es die Möglichkeit, das man immer überprüft ob der User sich noch auf der Seite befindet und wenn nicht Lizenz freigeben, allerdings ist das auf gewisse anzahl Performanz lastig und ich glaub sogar aktuell garnicht mit dem System Kompatibel.

Daher brauchen wir eine Funktion, welche wie beforeunload funktionieren soll, das der User vorher noch bestätigt und dann die Lizenzen freigegeben werden, mit den Funktionen welche wir dafür bereits haben.

Ich hoffe ihr könnt mir da helfen 😀

Mit freundlichen Grüßen Daniel

  1. Hallo Daniel,

    in der onunload-Phase kannst Du nicht mehr viel machen. MDN schreibt:

    • Nothing is visible anymore to the end user
    • UI interactions are ineffective (window.open, alert, confirm, etc.)
    • An error won't stop the unloading workflow

    Was dir helfen könnte, wäre das beforeunload Event. Nur: Du kannst Dich bei den Werbegangstern bedanken, die beforeunload verwendet haben, um User auf ihrer Seite einzusperren; das hat dazu geführt, dass beforeunload nicht mehr so funktioniert wie man es gern hätte.

    Nochmal die MDN:

    Note: To combat unwanted pop-ups, browsers may not display prompts created in beforeunload event handlers unless the page has been interacted with, or may even not display them at all.

    Since 25 May 2011, the HTML5 specification states that calls to window.alert(), window.confirm(), and window.prompt() methods may be ignored during this event. See the HTML5 specification for more details.

    Die Spec ist hier, gemeint ist das Verhalten, das in §5.6.1.1 und §6.5.1 bezüglich des termination nesting level beschrieben ist.

    Various browsers ignore the result of the event and do not ask the user for confirmation at all. The document will always be unloaded automatically. Firefox has a switch named dom.disable_beforeunload in about:config to enable this behaviour.

    Deswegen: weil Browser mit allen Bosheiten des Wilden Weiten Web zu kämpfen haben, ist das von Dir gewünschte Verhalten nicht erreichbar. Weil es missbraucht wurde.

    Was vermutlich gehen könnte, wäre ein Ajax-Call aus einem beforeunload oder unload Handler, der serverseitig die Lizenz freigibt. Wenn die Software das nicht unterstützt, stelle einen Change-Request.

    Ihr könntet auch die Lizenz-Haltedauer auf 5 Minuten reduzieren und über einen Intervall-Timer alle 4 Minuten per Ajax Hintergrundcalls absetzen, die zu einem Refresh der Haltedauer führen. Wenn ihr in der Timerfunktion dafür sorgt, dass maximal 6 Halte-Calls abgesetzt werden, seid ihr bei 29 Minuten und habt das alte Verhalten. Ob das möglich ist und wie man das genau machen muss, hängt natürlich von der verwendeten Software ab, das müsstest Du - wie ein Genie 😉 - selbst herausfinden.

    Mal gucken ob noch andere Ideen kommen 😀

    Rolf

    --
    sumpsi - posui - clusi
  2. Hej likeagenius,

    In unserer Firma haben wir ein eigenes Programm, welches so Funktioniert das jeder User der eine Website betritt eine Lizenz vergibt, je nach Kunden kann diese begrenzt sein.

    Falls es nur firmenintern genutzt wird, lässt sich vielleicht eine Regelung finden, die nicht schön, aber pragmatisch ist: das Fenster darf nur über einen Button (js) geschlossen werden. Dann kannst du den Button vor dem Schließen des Fensters noch beliebige Funktionen ausführen lassen.

    Selbst wenn sich nicht jeder dran hält, kann es sein, dass genug Leute sich dran halten, um das Problem mit der Last in den Griff zu bekommen.

    Schön, benutzerfreundlich und robust ist natürlich anders…

    Marc

  3. Hi there,

    Natürlich gibt es die Möglichkeit, das man immer überprüft ob der User sich noch auf der Seite befindet und wenn nicht Lizenz freigeben, allerdings ist das auf gewisse anzahl Performanz lastig und ich glaub sogar aktuell garnicht mit dem System Kompatibel.

    Viel anders wird's aber nicht gehen. Eine Lösung hängt imho davon ab, was Du serverseitig ändern kannst. Entweder wie schon beschrieben ein ajax-Request der von beforeunload ausgelöst wird oder (müßte man ausprobieren, ob das von den Browsern noch "erlaubt" wird) oder aber ein entsprechendes "Session"-Management. Der Client schickt nach dem Einloggen jede Minute eine Art "ich bin noch da-Ping" an den Server, der das registriert und wenn er ausbleibt, die Lizenz wieder freigibt. Den "Ping" könnte man leicht mit Javascript und Ajax realisieren, serverseitig ist schon etwas mehr zu erledigen; denn auch wenn natürlich das Serverskript von den Requests (mehrerer Clients) angestossen wird würde ich doch zur Sicherheit einmal pro Minute einen Cron-Job starten, der nachschaut, ob ein zu erwartender Ping ausgeblieben ist…

  4. Hallo likeagenius,

    du könntest eine Websocket-Verbindung aufbauen. Und wenn die geschlossen wird, dann wird die Lizenz wieder freigegeben. Das passiert allerdings auch bei jedem Reload und bei jedem Seitenwechsel…

    LG,
    CK

    1. du könntest eine Websocket-Verbindung aufbauen. Und wenn die geschlossen wird, dann wird die Lizenz wieder freigegeben. Das passiert allerdings auch bei jedem Reload und bei jedem Seitenwechsel…

      Oh je. Hintergrund"ping" per "xmlhttp"-Request oder "ajax"-Request aller paar weniger Sekunden könnte auch gehen. Dabei nur eine minimale Anfrage stellen, die auf dem Server innerhalb von maximal 5ms beantwortet werden kann (PHP >= 7.0 ist wegen des Caches hilfreich, da bekommt man auch Einiges in der Zeit hin). Stellt sich die Frage wie man das mit Fenstern halten will, die auf einem Mobilgerät in den Hintergrund geraten und zwecks Stromsparen angehalten werden.

      1. Hallo Regina,

        da der OP von "Browserfenster schließen" sprach, dürfte der Usecase der Corporate Desktop sein.

        Aber mal abwarten ob er sich überhaupt nochmal meldet…

        Rolf

        --
        sumpsi - posui - clusi
  5. Guten tag,

    also natürlich melde ich mich nochmal :D Aber da das die Arbeit betrifft, nur wenn ich auch dort bin.

    Nun es sind viele Antworten dabei, leider keine die ich hören wollte.. 😟 Also das mit den hin und her Pingen scheint dann also die einzige Möglichkeit zu sein wenn ich das richtig lese.

    Das heißt wir müssen, sofern es sehr notwendig ist, uns etwas einfallen lassen.

    Auf mobilen Geräten kommt unsere Software in der Regel selten vor, wenn es doch vorkommt dann nur an Tablets.

    Nunja erstmal vielen Dank für eure Hilfe & Antwort!

    Mfg Daniel

    1. Hallo likeagenius,

      du könntest Dir auch über einen eingebetten Browser Gedanken machen. Da hast Du mehr Kontrolle über das Schließen des Fensters. Du solltest diesen embedded Browser dann aber NUR für diesen Zweck verwenden lassen, weil die Sicherheitskonzepte des kompletten Browsers in solchen embedded-Umgebungen beeinträchtigt sind.

      In Windows: Internet Explorer als Web Control (geht auf jeden Fall mit .net; meines Wissens auch generell als ActiveX). Es ist dann aber definitiv IE, mit Edge geht es nach meinen Recherchen nicht.

      Mit breiterem Einsatzspektrum: Chromium Embedded Framework (CEF)

      Die Mozilla-Version dieses Konzepts, XULRunner, wurde leider eingestellt.

      Rolf

      --
      sumpsi - posui - clusi