onunload + ajaxreqest/sessions?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • onunload + ajaxreqest/sessions?

    Hallo. Ich hab einb Problem verstehe aber nicht wieso das ganze nicht funktioniert.

    Ich benutze den befehl onunload, um beim seitenverlassen oder reload ein ajax request aufzurufen.
    Es wird die funktion session_destroy(); aufgerufen.. Das ajaxscript ruft die do_logout.php auf, in der die session mittels session_destroy(); zerstört wird.

    Wenn ich die Seite jetzt verlasse oder neulade, passiert gar nichts. Lasse ich mir die session mittels print_r ausgeben, steht sie auch noch da. Das script was mit den sessions arbeitet, gibt aber gar keine rückgabe mehr (also irgendwie werden die sessions wohl doch gelöscht) Wenn ich die seite zum zweiten mal verlasse oder aktualisiere, erst dann, ist die session auch im befehlö print_r($_SESSION); gelöscht.

    Was ich mich jetzt frage, wieso erst nach dem zweiten reload? Es ist ziemlich wichtig, dass es beim ersten reload funktioniert.

    Quellcode

    1. window.onunload = function Exit() {
    2. session_destroy();
    3. }



    Danke schonmal im Vorraus
  • dynambee schrieb:

    Das es beim zweiten Mal funktioniert wundert mich etwas. Rufe die Funktion session_destroy() doch direkt mit dem Event auf:

    Quellcode

    1. window.onunload = session_destroy;


    Hey dynambee schonmal danke für deine Antwort. Ja stimmt weiß auch nicht wieso ich es nicht direkt aufgerufen habe.

    Aber so funktioniert es komischerweise gar nicht mehr .. Also die session wird nicht zerstört.
    Ruf ich es wieder mit function Exit{ ....auf, dann geh es wieder. Aber immernoch nur beim Zweiten reload.


    Kann es sein, dass mein Vorhaben wohlmöglich gar nicht möglich ist?
    ersetze ich nämlich das session_destroy durch ein alert('text'); wird der alert erst angezeigt wenn die seite schon wieder fast komplett aufgebaut ist..
    Das würde erklären wieso der teil mit dem print_r($_SESSION) noch alles anzeigt aber die session trotzdem gelöscht ist.
    Und natürlich würde das den erfolg mit dem doppel reload erklären.


    okay das war quatsch..jetzt wird der alert angezeigt, wenn die seite verlassen wird. schon richtig.


    Achso eine ergänzung. Rufe ich das ganze per <button onclick"session_destroy"> auf, funktioniert der logout..
    Aber selbst eine einfache weiterleitung funktioniert auch nicht =>

    Quellcode

    1. window.location.href = 'index.php';


    Es passiert einfach nichts.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Snowflake ()

  • AJAX arbeitet prinzipiell asynchron.. der prozess wird gestartet. es wird aber nicht gewartet, bis eine antwort kommt.

    wenn du die seite also verlässt hat der browser keinen grund den request fertig laufen zu lassen und er wird ihn vermutlich canceln.
    Auf localhost/mit enormer Bandbreite könnte ich mir vorstellen, dass es funktioniert.

    Ansonsten musst du auf synchrones AJAX umstellen (welch gegensatz ;))
    das ist der 3te Parameter im open() Aufruf
    für synchrone requests sieht das so aus

    Quellcode

    1. req.open('post', 'func.php', false);


    siehe auch: [google]ajax synchron[/google] + [google]ajax onunload[/google]

    aber für was brauchst du überhaupt eine session wenn du sie nach dem verlassen der seite löschst?
    vermutlich nur für die ajax requests. statt der session ID kannst du auch einfach eine andere ID nehmen und diese per GET übergeben.
  • d0nut schrieb:

    in der tat ist dein vorhaben nicht "zuverlässig" möglich.
    ajax arbeitet asynchron.. der prozess wird gestartet. es wird aber nicht gewartet, bis eine antwort kommt.

    wenn du die seite also verlässt hat der browser keinen grund den request fertig laufen zu lassen und er wird ihn vermutlich canceln.
    Auf localhost/mit enormer Bandbreite könnte ich mir vorstellen, dass es funktioniert.

    Ja genau das hab ich mir im nachhinein wohl auch gedacht, nachdem der onSuccess Handler keine ausgabe gegeben hat.


    aber für was brauchst du überhaupt eine session wenn du sie nach dem verlassen der seite löschst?
    vermutlich nur für die ajax requests. statt der session ID kannst du auch einfach eine andere ID nehmen und diese per GET übergeben.


    Ich wollte gerne, dass der User beim schließen/reloaden der Seite in der Datenbank als Offline gesetzt wird, damit das ganze sofort stattfindet. Und nicht mit einem Cronjob nur alle x Minuten.

    Ich hab die Methode bei einer anderen Seite gesehen, dass nach einem Reload der Seite oder einem Schließen (nur den Tab nicht den Browser) und erneutem aufrufen der Seite, der Login erneut gefordert wird.

    Aber okay. Dann muss der Cronjob eben seine Arbeit weiter ausüben :P
  • Ahh cool danke schonmal. Jetzt bekomm ich auch den responseText zurückgegeben. Das funktioniert also schonmal.

    Aber ich habe in der index.php oben im php teil das stehen, um das script für testzwecke zu stoppen falls die session nicht existiert.

    Quellcode

    1. <?php
    2. if(!isset($_SESSION['uid'])) {
    3. exit();
    4. }
    5. ?>


    Komischerweise, wird mir beim ersten reload trotzdem noch die ganze zeite gezeigt. Erst beim zweiten reload wird mir die leere seite angezeigt. liegt es an meiner php if abfrage?


    Mein (A)jax Request (prototype) sieht so aus.

    Quellcode

    1. new Ajax.Request('go_logout.php', { method: 'post',asynchronous: false); }


    Also das hat eigentlich auch funktioniert. Trotzdem funktioniert der logout erst nach dem zweiten reload.
    Die Session ist nach dem ersten Reload gelöscht. Das hab ich nachgeschaut indem ich einfach eine neue datei erstellt hab und geschaut hab wann die session existiert oder wann sie zerstört wurde.

    Aber wieso kapiert das die index.php erst nach dem zweiten reload, dass die session noch da ist?

    EDIT:// Wie mir gerade aufgefallen ist, passiert das ganze jetzt nur noch beim reload. Wenn ich den Tab schließe, und die seite erneut aufrufe, ist die session gelöscht und die seite wird auch gestoppt durch exit();

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Snowflake ()

  • Sorry für den Doppelpost aber sonst wird es was zuunübersichtlich denke ich.

    Damit ich ausschließen konnte, dass mein restlicher Code dran schuld ist, hab ich mal nur die Funktion onunload getestet. Also erst nach dem zweiten Reload wird das script gestoppt.

    index.php

    Quellcode

    1. <?php session_start();
    2. if(!isset($_SESSION['uid'])){
    3. exit("SESSION NOT FOUND");
    4. }
    5. echo $_SESSION['uid'];
    6. ?>
    7. <html>
    8. <head>
    9. <script src="js/prototype.js" type="text/javascript"></script>
    10. <script type="text/javascript">
    11. function Exit() {
    12. new Ajax.Request('go_logout.php', {
    13. method: 'post', asynchronous: false} );
    14. }
    15. </script>
    16. </head>
    17. <body onunload="Exit();">
    18. TESTSEITE
    19. </body>
    20. </html>
    Alles anzeigen


    go_logout.php

    Quellcode

    1. <?php session_start();
    2. session_destroy();
    3. ?>


    und für den test zum session erstellen:

    Quellcode

    1. <?session_start();
    2. $_SESSION['uid']=3;
    3. ?>


    Klappt also auch nicht. Kann jemand ein Fehler meinerseits erkennen?
  • Ich muss zugeben, dass ich so keinen Fehler erkennen kann. Aber mal ein Gedanke in eine andere Richtung.

    Warum sendest du nicht einfach die ID der Session beim Schließen der Seite, sodass diese in logout.php abgeglichen, mit der aktuellen Zeit aufgefüllt und dann irgendwo gespeichert werden kann? So brauchst du dich nicht mit dieser aus meiner Sicht doch recht unhandlichen Session-Geschichte rumquälen. Sessions werden im übrigen automatisch beim Schließen des Browsers gelöscht.
  • Hey danke schonmal, für deine hilfe und dass du überhaupt alles durchgelesen hast.


    Ich versteh nur dein denkansatz gerade leider nicht. Kannst du versuchen mir zu erklären was du meinst?
    Also ich versteh gerade nicht was mir das bringt, wenn ich die id der session der logout.php übergebe und mit der aktuellen zeit definiere und speichere.
    Ich brauch nur ein kleinen denkanstoß um das zu verstehen. hab manchmal eine lange leitung ^^

    Oder meinst du, dass ich einfach die session nicht lösche, sondern bei schließen/reloaden der seitein den user in der datenkbank auf offline setze. nee oder?


    Ja das Sessions beim schließen des browsers gelöscht werden weiß ich. aber danke für die tip.
    Das schließen wäre ja auch kein problem, das problem wären wenn die Tab's die browser unterstützen.
    Aber wenn der Tab geschlossen wird, funktioniert die session zerstörung ja einwandfrei. Nur bei dem reload passiert rein gar nichts. bzw erst nach dem zweiten reload.
    Also würde sich die seite doch im hintergrund neu laden bevor die funktion session_destroy(); ausgeführt wurde.

    Und zwar wenn ich die funktion per onclick öffne, und dann die seite reloade geht es. ich hab das gefühl als ob die funktion zwar ausgeführt wird aber halt im hintergrund die seite schon wieder neu anfängt zu laden.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Snowflake ()

  • Das Stichwort ist die Session erst gar nicht zu löschen. Vielleicht hast du irgendwo eine Tabelle in der Datenbank, wo jedem Benutzer eine ID zugeordnet wird. Nun wird beim schließen der Seite die ID an eine andere PHP-Seite gesendet, die die Informationen analysiert und bei entsprechend erfolgreicher Validierung (Prüfung) der Daten den momentanen Zeitpunkt bestimmt und diesen abspeichert.

    Soweit klar? Hab manchmal eine leichte Begabung mich etwas umständlich auszudrücken. ;)
  • Lemmi schrieb:


    Das Stichwort ist die Session erst gar nicht zu löschen. Vielleicht hast du irgendwo eine Tabelle in der Datenbank, wo jedem Benutzer eine ID zugeordnet wird. Nun wird beim schließen der Seite die ID an eine andere PHP-Seite gesendet, die die Informationen analysiert und bei entsprechend erfolgreicher Validierung (Prüfung) der Daten den momentanen Zeitpunkt bestimmt und diesen abspeichert.

    Soweit klar? Hab manchmal eine leichte Begabung mich etwas umständlich auszudrücken. ;)


    Hey danke schonmal. Also eine Tabelle in der Datenbank wo jedem User eine ID zugeordnet wird hab ich natürlich. Schonmal ne gute vorrausetzung :P
    Soweit auch alles verstanden.

    Aber selbst Datenbankabfragen sind nach einem reload falsch. Ich versteh das ganze nicht. Bei all meinen anderen Scripten funktioniert das.
    Ich setze beim logout die spalte online auf 0...und in der index.php die neu gelanden wird, wird abgefragt ob der status 0 ist. Aber nö der ist natürlich 1 obwohl im phpmyadmin auch die spalte online auf 0 ist.




    EDIT://

    Ich habe gerade gemerkt, dass der IE7 einwandfrei das macht was er soll. Probleme gibt es also nur bei Firefox 2 u.3 und Google Chrome. Opera macht sich gar nichts aus dem Befehl window.onunload
    Bei IE7 wird beim reload die session zerstört und die seite sofort gestoppt. nach dem ersten reload. und nicht nacht zwei.

    Woran kann es dann liegen? Am ajax bzw sjax request?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Snowflake ()

  • Hmm ... ich muss zugeben, da bin ich überfragt. Ich hab das auch schon so einige male erlebt, das besonders bei kleineren Änderungen in der Datenbank, diese noch etwas braucht, um entsprechend richtige Daten zu schicken. Aber vielleicht weiß d0nut dazu mehr. Letzte, aber sicherlich sehr stark Traffic-zehrende Möglichkeit wäre, dass du in sehr kurzen Zeitabständen mit AJAX eine Anfrage an den Server schickst. So wird der Eintrag der Datenbank kontinuierlich aktualisiert und du hast eventuell noch die Möglichkeit den Standort des Benutzers auf deiner Seite festzustellen und dessen Zeit auf dieser Seite festzuhalten - wobei das auch sehr gut ohne AJAX zu erledigen wäre.
    Ist es denn ein Feature, auf das du nicht verzichten kannst?
  • Lemmi schrieb:

    Hmm ... ich muss zugeben, da bin ich überfragt. Ich hab das auch schon so einige male erlebt, das besonders bei kleineren Änderungen in der Datenbank, diese noch etwas braucht, um entsprechend richtige Daten zu schicken. Aber vielleicht weiß d0nut dazu mehr. Letzte, aber sicherlich sehr stark Traffic-zehrende Möglichkeit wäre, dass du in sehr kurzen Zeitabständen mit AJAX eine Anfrage an den Server schickst. So wird der Eintrag der Datenbank kontinuierlich aktualisiert und du hast eventuell noch die Möglichkeit den Standort des Benutzers auf deiner Seite festzustellen und dessen Zeit auf dieser Seite festzuhalten - wobei das auch sehr gut ohne AJAX zu erledigen wäre.
    Ist es denn ein Feature, auf das du nicht verzichten kannst?


    Hey trotzdem danke, dass du versucht hast zu helfen. Ja genau mal schaun ob d0nut vllt noch ein ausweg kennt. Ansonsten muss ich mal schaun.


    Das mit dem Ajaxrequest und timeout geht leider nicht, da die seite nicht neugeladen werden darf. Weil schon innerhalb der seite ajaxrequest mit einem timeout laufen, die dann natürlich unterbrochen werden würden.
    Klar ich kann auf das feature verzichten. Ist halt nur was doof, dass der user die seite dann angezeigt bekommt, und überall steht eine fehlermeldung (jetzt nicht von php her. sondern von mir programmiere wenn eine sql abfrage kein ergebnis und so liefert ) und alles. Aber wenn es nicht anders geht, muss ich mit leben. :P ^^

    Aber was mich wundert ist, dass der internet explorer mal als einziger etwas macht was er soll und das ohne probleme.
  • Magst du mir mal verraten, was du genau mit der AJAX-Funktion machst? Laufen irgendwelche wichtigen Login- oder Logout-Bereiche über AJAX? Wenn ja, würde ich dir sicherheitstechnisch stark davon abraten. Browserseitige Sicherheitsabfragen ist ja im Grund eine Tür ohne Tor - wenn du verstehst! ;)
  • Lemmi schrieb:

    Magst du mir mal verraten, was du genau mit der AJAX-Funktion machst? Laufen irgendwelche wichtigen Login- oder Logout-Bereiche über AJAX? Wenn ja, würde ich dir sicherheitstechnisch stark davon abraten. Browserseitige Sicherheitsabfragen ist ja im Grund eine Tür ohne Tor - wenn du verstehst! ;)



    Nee Login/Logout berreiche laufen nicht über ajax. Sondern anzeigen aus der datenbank. Welche user aus meiner liste online ist, private nachrichten die sich automatisch aktualisieren und sowas.


    Aber was meinst du genau mit login/logout berreiche mit ajax? Das script womit man arbeitet bleibt doch eigentlich das gleiche egal ob mit ajax oder ohne ajax gearbeitet wird. das script muss immer abgesichert werden.
  • Snowflake schrieb:

    Aber was meinst du genau mit login/logout berreiche mit ajax? Das script womit man arbeitet bleibt doch eigentlich das gleiche egal ob mit ajax oder ohne ajax gearbeitet wird. das script muss immer abgesichert werden.


    Ich dachte, dass du mit AJAX ein Login ermöglichst, indem du das ganze ohne Seitenneuladen realisierst, sondern eine Anfrage an den Server schicken lässt, die Session dort erstellt wird und dann die ganze Geschichte weitergeht. Und das dann natürlich auch nochmal für den Logout. Klar ist das Sicherheitsrisiko nicht hoch, das besondere bei PHP ist aber die Serverseitigkeit und dass so kein Mensch von Außerhalb größeren Einfluss auf den Loginvorgang nehmen kann. Das ist bei AJAX im schlimmsten Fall etwas anders. Sagen wir lieber: Ich warne davor. ;)
  • Ich hab die Methode bei einer anderen Seite gesehen, dass nach einem Reload der Seite oder einem Schließen (nur den Tab nicht den Browser) und erneutem aufrufen der Seite, der Login erneut gefordert wird.


    Kannst du nochmal zusammenfassen für was du die Funktion benötigst?
    Warum erstellst du eine Session, die du nach einmaliger Nutzung wieder löschst?
    Für den Benutzer ist es vermutlich ganz egal, oder?

    Du willst nur einen Online Status verwalten, damit andere Benutzer den Online Status einsehen können?
    Spontan fällt mir da kein "Best Practice" ein...
    Mit Crons solltest du aber nicht arbeiten. Da liefert dir der php session handler ein viel besseres Werkzeug.
    Über das s.g. execution_ratio kannst du alte Sessions zum beispiel bei jeder 100sten Session Nutzung aufräumen.
  • d0nut schrieb:

    Ich hab die Methode bei einer anderen Seite gesehen, dass nach einem Reload der Seite oder einem Schließen (nur den Tab nicht den Browser) und erneutem aufrufen der Seite, der Login erneut gefordert wird.


    Kannst du nochmal zusammenfassen für was du die Funktion benötigst?
    Warum erstellst du eine Session, die du nach einmaliger Nutzung wieder löschst?
    Für den Benutzer ist es vermutlich ganz egal, oder?

    Du willst nur einen Online Status verwalten, damit andere Benutzer den Online Status einsehen können?
    Spontan fällt mir da kein "Best Practice" ein...
    Mit Crons solltest du aber nicht arbeiten. Da liefert dir der php session handler ein viel besseres Werkzeug.
    Über das s.g. execution_ratio kannst du alte Sessions zum beispiel bei jeder 100sten Session Nutzung aufräumen.



    Hey. Ja für den Benutzter der die Seite neu läd/ schließt ist es ganz egal. Er wird halt auf Offlline gesetzt damit die anderen Benutzer den Status sehen. Das ist richtig.

    Die Sessions sollen nicht nach einmaliger Benutzung gelöscht werden. Nur wenn der User die Seite bzw. den Browser Tab schließt.

    Das mit der execution_ratio muss ich mir mal anschaun. Danke schonmal dafür.