Announcement

Collapse
No announcement yet.

onunload mit Sjax + Session_destroy(php)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • onunload mit Sjax + Session_destroy(php)

    Hallo Ich weiß nicht genau in welches Forum das jetzt kommt. Ob Javascript oder doch PHP. Ich dachte mit da der hauptteil mit javascript zu tun hat, kommt es hier rein.

    Und zwar ist das Problem: Ich hab ein Loginscript, ich gleiche die Postdaten vom Loginformular mit der Datenbank ab und setze bei richtiger Eingabe eine userid session.


    Jetzt arbeite ich mit dem Befehl onunload beim Verlassen oder Neuladen (F5 refresh ) wird eine sjax Funktion aufgerufen, die den User ausloggt.

    Diese php Datei, von der sjax funktion aufgerufen, löscht die Sessions und setzt den user in der Datenbank auf offline.

    In der Hauptdatei, gucke ich so ob der User eingeloggt ist.

    Code:
    if(!isset($_SESSION['uid'])){
    exit("nicht eingeloggt");
    }
    Schließe ich den Tab des Browsers und gehe erneut auf die Seite, siehe da alles funktioniert wie es soll. (Ich weiß das die Sessions automatisch beim schließen des Browsers gelöscht werden..Aber nicht beim Tab)

    Drücke ich aber nur F5 und lade die Seite neu, passiert nichts.

    Lasse ich mir per print_r($_SESSION) die Session ausgeben ist alles angeblich noch da. Die SQL Abfragen die mit der Session im WHERE Tag arbeiten, funktionieren aber nicht mehr.

    Trotzdem die Session wurde erflogreich gelöscht. Der Session-Cookie ist gelöscht und lasse ich mir in einer anderen PHP Datei die Session ausgeben. kommt nur Array()

    Sobald ich die Seite dann nocheinmal aktualisiere, kommt auch der text "nicht eingeloggt".

    Weiß jemand woran es liegen kann, dass der Browser beim ersten Refresh die Session noch "erkennt" obwohl sie längst gelöscht ist?

    Im Internet Explorer muss ich aber sagen, dass alles Funktioniert.

    Problem besteht nur beim Firefox 2+3 und Opera macht sich gar nichts aus dem Befehl "onunload"

    Danke schonmal im Vorraus. Wenn überhaupt den lange Text liest :P

  • #2
    Originally posted by Snowflake View Post
    ...Trotzdem die Session wurde erflogreich gelöscht. Der Session-Cookie ist gelöscht und lasse ich mir in einer anderen PHP Datei die Session ausgeben. kommt nur Array()...
    Das wird wohl ein Timing-Problem sein. Jenachdem ob die per AJAX aufgerufene Auslog-Funktion schneller als das Neuladen der Seite ist. Wenn der Browser eine Anfrage an den Server schickt, übermittelt er im Request auch die Cookies für den Browser und hier wird dein Sessioncookie einfach noch da sein, so daß im PHP die Cookiedaten noch zur Verfügung stehen.
    Mit dem Plugin HttpFox für den FF kannst du dir sehr schön die HTTP-Requests und die übermittelten Daten ansehen. Wäre sicherlich für dein Problem ganz hilfreich. Alternativ kannst du ja mal versuchen in deinem onunload-Handler den Cookie bereits per Javascript zu löschen - also nicht erst über PHP.

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Hey schonmal danke an dich. Das ist eigentlich sogar eine sehr gute Idee.
      Nur den PHPSESSID Cookie kann ich aus dem Pfad nicht löschen. Macht ja nichts.

      Dann hab ich mir gedacht, beim login erstelle ich einen Cookie "login" mit dem Wert 1.
      In die Abfrage der Hauptseite kommt, ob ein Cookie existiert der Login heißt und den Wert 1 hat.

      Aber auch hier das gleiche...selbst wenn ich diesen per Javascript löschen lasse beim verlassen/neuladen der Seite, ist das noch zu langsam. Der Cookie wurde gelöscht, aber die Seite hat das ganze noch nicht verarbeitet, und macht weiter als wäre der Cookie und die Session noch da. -.-'


      Für mich ist der Befehl onunload solangsam der unnötigste begriff den Javasciript zu bieten hat, wenn man ihn eh nicht anwenden kann..außer das man ein alert ausgeben kann.

      Werde jetzt mal das Addon HttpFox installieren. Aber wegen dem timing Problem, wurde mir gesagt, ich solle Sjax und nicht ajax benutzen. Also eine synchroneund nicht asynchrone abfrage. Das hatte eigentlich auch geklappt.

      Aber wenn selbst ein Cookie der von javascript direkt gelöscht wird zu langsam ist weiß ich auch nicht weiter.

      Comment


      • #4
        Hallo Snowflake,

        bist du dir auch sicher das wirklich die Session "überlebt" und nicht evtl. eine Neue aufgemacht wird? Beim Neuladen der Seite werden auch GET- und POST-Parameter erneut übertragen und damit ggfs der Login-Mechanismus inkl. Sessionerstellung ausgelöst.
        Also vergleich mal die Session-IDs.

        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Hey. Also ich hab mir jetzt mal die session_id ausgeben lassen.
          Und die bleibt gleich.

          Vor dem Login: 0a47a906a880ecbaa3789c812a9f154b
          Nach dem Login: 0a47a906a880ecbaa3789c812a9f154b

          Nach dem ersten refresh: 0a47a906a880ecbaa3789c812a9f154b
          (ab da existiert sie eigentlich schon gar nicht mehr, wird aber trotzdem noch ausgegeben)

          Nach dem zweiten refresh: -


          Logge ich mich dann erneut ein, bekomme ich wieder die gleiche session_id.


          Die Postdaten des Login-Mechanismus und die damit zu erstellenden Sessions werden nicht erneut aufgerufen. Das hab ich nachgeschaut.

          Die Session ist ja auch gelöscht. Und das mit dem Cookie hat ja auch nicht geklappt. Vllt läd die Seite einfach bei dem onunload Befehl nicht komplett neu oder einfach zu schnell neu.

          Wenn es nicht geht kann man ja nichts dran ändern. Aber bin dir für deine Hilfe bisher dankbar.

          Ps. Ich hatte mal ein Beispiel gemacht, was sich nur auf den Befehl onunload beschränkt, was mein Problem darstellt.

          index.php
          Code:
          <?php session_start();
           
          if(!isset($_SESSION['uid'])){
          exit("SESSION NOT FOUND");
          }
           
          echo $_SESSION['uid'];
          ?>
           
          <html>
          <head>
          <script src="js/prototype.js"         type="text/javascript"></script>
           
          <script type="text/javascript">
          function Exit() {
           
              new Ajax.Request('go_logout.php', { 
              method: 'post', asynchronous: false} );
          }
          </script>
          </head>
           
          <body onunload="Exit();">
          TESTSEITE
          </body>
          </html>
          go_logout.php
          Code:
          <?php session_start();
          session_destroy();
          ?>
          Und zum Test die Session erstellen und definieren:
          Code:
          <?session_start();
          $_SESSION['uid']=3;
          ?>
          Das ganze klappt im IE7 prima. Nur im Firefox halt nicht.



          EDIT://
          Also gut ich mach es jetzt einfach so, dass ich den User per Sjax Request auf Offline setze.
          und ein geringes session_cache_expire setze. Da sowieso internt Scripte laufen die sich alle paar sekunden wiederholen.


          Jetzt ist noch die frage. Opera erlaubt den befehl onunload ja nur bei verweis. Sprich wenn man auf einen link klickt und nicht wenn man die seite verlässt.

          Gibt es dafür eine ersatztfunktion...ich denke sehrwarscheinlich nicht oder?

          dankee
          Zuletzt editiert von Snowflake; 20.10.2008, 20:20.

          Comment


          • #6
            Originally posted by Snowflake View Post
            [SIZE=1]...Logge ich mich dann erneut ein, bekomme ich wieder die gleiche session_id.
            Also existiert der Session-Cookie weiterhin!

            Lt. PHP-Handbuch zu session_destroy() wird aber auch darauf hingewiesen, daß der Cookie und die Session-ID NICHT automatisch gelöscht wird:
            Um die Session komplett zu löschen, z.B. um einen Benutzer auszuloggen, muss auch die Session-ID gelöscht werden. Wenn zum Verfolgen der Session ein Cookie benutzt wird (standardmäßige Einstellung), muss das Session-Cookie gelöscht werden. Dafür kann setcookie() verwendet werden.
            Vielleicht solltest du in der Richtung nochmal nachdenken.

            Gruß Falk
            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

            Comment


            • #7
              Hey danke du hast recht. Ich hatte ein großen Denkfehler. session_destroy(); löscht die session und schließst man dann den browser wird natürlich auch der cookie ungültig. Aber ich schließe ja nicht den browser. ich aktualisiere nur.


              Lösche ich den Cookie jetzt von einer anderen Seite aus, und aktualisiere die hauptseite, bin ich ausgeloggt.


              Aber lasse ich beim neuladen/verlassen der seite den cookie per sjax request löschen (und "setcookie"), bringt das immernoch nichts. also er läd die seite wieder einfach neu als ob noch eine session bestehen würde -.-

              Ist doch richtig so oder? So hab ich bis jetzt immer Cookies gelöscht.
              Code:
              setcookie("PHPSESSID", ' ', time()-3600, "/");
              Gucke ich bei Firefox nach, gibt es aufeinmal zwei cookies mit dem namen PHPSESSID


              ich glaub ich hab dich auch lange genug mit dem problem aufgehalten und werd es einfach lassen.
              Zuletzt editiert von Snowflake; 21.10.2008, 20:14.

              Comment


              • #8
                Originally posted by Snowflake View Post
                ...Gucke ich bei Firefox nach, gibt es aufeinmal zwei cookies mit dem namen PHPSESSID
                Hallo Snowflake,
                wenn es plötzlich zwei gibt, dann sind sie sicherlich für unterschiedliche Pfade gesetzt. Dein Löschen bezieht sich z.B. auf '\'. Für welchen Pfad ist denn der Session-Cookie angelegt? (Läßt sich mit session_get_cookie_params() ermitteln)
                Zusätzlich würde ich beim Löschen des Cookies einen "leeren" String für value übergeben und nicht ' '. Auch würde ich mich nicht darauf verlassen, das der Cookie PHPSESSID heißt. Also:
                PHP Code:
                $cookiePrm session_get_cookie_params();
                setcookie(session_name(), ''time()-3600$cookiePrm['path']); 
                Gruß Falk
                Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                Comment


                • #9
                  Hallo.

                  Also der Cookie ist für den Pfad '\' angelegt.
                  Code:
                  Array ( [lifetime] => 0 [path] => / [domain] => [secure] => [httponly] => )
                  Das ist aber auch von mir so gewollt, da ich die Sessions subdomain überschreitent benötige.

                  Aber dank deinem Tip bzw. kleinen Script lässt sich der Cookie endgültig löschen und die session_id stimmt auch nicht mehr überein.

                  Dennoch loggt der Hund sich nicht automatisch beim ersten Reload aus..immernoch benötigt es zwei anläufe.

                  Kann es doch einfach sein, dass beim Reload im Hintergrund schon angefangen wird die Seite neu zu lade? (Auch wenn es ein Sjax request ist)

                  Weil beim zweiten Reload funktioniert ja alles so wie es soll. Das gleiche ist, wenn ich den Tab schließe, und dann wieder auf die Seite gehe, dann geht es auch.

                  Und im Internet Explorer 7 funktioniert das ganze ja komplett. Also beim ersten Reload ist man ausgeloggt, und wird aufgefordert sich erneur einzuloggen


                  Aber schonmal ein riesen Dank an dich, dass du mir versuchst zu helfen.
                  Das schätze ich wirklich.

                  Comment


                  • #10
                    Originally posted by Snowflake View Post
                    ...Kann es doch einfach sein, dass beim Reload im Hintergrund schon angefangen wird die Seite neu zu lade? (Auch wenn es ein Sjax request ist)...
                    Hallo Snowflake,

                    da müßte man sich jetzt den Code des Browsers ansehen
                    Ich kann mir jedoch gut vorstellen, das bei einem Reload der Request an den Server so abgeschickt wird, wie beim ursprünglichen Aufruf (inkl. aller Header und damit auch Cookies) unabhängig davon ob diese Daten sich mittlerweile geändert haben. Das wäre in meinen Augen für einen "Reload" durchaus logisch.
                    Da dies aber Ansichtssache (und wahrscheinlich nirgendwo fest definiert) ist, würde es auch erklären warum unterschiedliche Browser zu unterschiedlichem Verhalten neigen.
                    Nicht umsonst hat sich im Bereich der Sessions eher die "Logout nach X sek. Inaktivität" durchgesetzt.

                    Gruß Falk
                    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                    Comment


                    • #11
                      Hallo Snowflake,

                      ich hab mir das mal im FF angesehen. Mit HttpFox kann man sehr schön sehen, das der erste Request zum Neuladen der Seite ausgelöst wird BEVOR der onunload-Event ausgeführt wird. Dabei wird auch der (zu diesem Zeitpunkt noch gültige) Cookie mitgeschickt. Die Anfrage nach der Hauptseite kommt also beim Server definitv vor dem per SJax geschickten Logout an, somit sind alle Daten in der Session noch vorhanden. Abhilfe würde hier eigentlich nur eine explizite Weiterleitung auf eine Dummy-Logout-Seite bringen.
                      Also z.B. so:
                      In der index.php:
                      [highlight=javascript]
                      function Exit() {
                      if (location.href != 'logout.php') {
                      new Ajax.Request('go_logout.php', {
                      method: 'post', asynchronous: false} );
                      location.href = 'logout.php';
                      }
                      }
                      [/highlight]
                      logout.php:
                      PHP Code:
                      <?php session_start();
                      session_destroy();
                      $cookiePrm session_get_cookie_params();
                      setcookie(session_name(), ''time()-3600$cookiePrm['path']);  
                      header('Location: index.php');
                      ?>
                      Gruß Falk
                      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                      Comment


                      • #12
                        Hallo Falk Prüfer. Ich weiß deine Hilfe wirklich zu schätzen, aber ich glaub da ist der Wurm drin.. Das funktioniert alles nicht.


                        Das mit dem location.href hatte ich auch schoneinmal ausprobiert. Aber das wird wohl anscheinend Ignoriert. Das mit dem header location in der PHP Datei zwar noch nicht, aber da passiert auch gar nichts.

                        Ich glaub du bist so langsam auch mit deinem Latein am Ende?


                        Aber ich glaub ich sollte mir HttpFox auch nocheinmal genauer anschaun. Ich bin damit leider noch nicht so ganz klar gekommen.


                        Edit://
                        Das ganze kann man wohl auch irgendwie anders machen.
                        Hab hier mal einen Ajax basierenden Chat gefunden Ajax Chat
                        Falls du es mal testen willst (Login: test Passwort: test)
                        Quelltext runterladbar unter (www.ajaxim.com)

                        Lade ich dort die Seite neu, lande ich direkt auf der Loginseite. Egal ob Opera, IE oder Firefox
                        Hab mir das ganze mal herruntergeladen. Aber entweder ich werde nie schlau aus dem Quelltext oder ich sehe nichts besonderes wie er es macht.

                        Ich hab auch versucht mit Firebug und der Console zu schaun was beim Reload für eine Datei angesprochen wurd und welche Funktion ausgeführt wird.. Aber da kommt auch irgendwie nichts.

                        Naja Programmieren kann schon manchmal doof sein :P
                        Zuletzt editiert von Snowflake; 24.10.2008, 01:38.

                        Comment


                        • #13
                          Hallo Snowflake,
                          Originally posted by Snowflake View Post
                          ... Das funktioniert alles nicht.
                          ist nicht gerade eine qualifizierte Fehlerbeschreibung

                          Dazu kann ich nur sagen das ich es getestet und das gewünschte Ergebnis erzielt habe.

                          Prinzipiell muß ich aber gestehen das ich den Sinn des Ganzen nicht verstehe und das eher für unüblich halte. Mich als User würde es stören, wenn ich mich neu anmelden muß, nur weil ich die Seite neu geladen habe - welchen signifikanten Grund gibt es dafür?

                          Gruß Falk
                          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                          Comment


                          • #14
                            Originally posted by Falk Prüfer View Post
                            Hallo Snowflake,

                            ist nicht gerade eine qualifizierte Fehlerbeschreibung

                            Dazu kann ich nur sagen das ich es getestet und das gewünschte Ergebnis erzielt habe.

                            Prinzipiell muß ich aber gestehen das ich den Sinn des Ganzen nicht verstehe und das eher für unüblich halte. Mich als User würde es stören, wenn ich mich neu anmelden muß, nur weil ich die Seite neu geladen habe - welchen signifikanten Grund gibt es dafür?

                            Gruß Falk
                            Hey du hast recht sorry. Also es passiert einfach nichts, wenn ich deine Funktion + Logout Datei gegen meine tausche.
                            Es ist wie vorher. Ich werde weder umgeleitet noch passiert sonst etwas.
                            Die Seite wird einfach neu geladen wie vorher und das war es. Keine Umleitung auf logout.php



                            Jaa das haben schon mehrere gesagt, aber auf der Seite geht es darum, aktuelle Onlinestaten von Usern anzuzeugen und Nachrichten ect. anzuzeigen.
                            Intern laufen alle x Sekunden ajax Requeste ab, die den Inhalt der Seite aktualisieren. Deswegen soll beim Verlassen der Seite der User auf offline gesetzt werden, damit es für die anderen User sichtbar ist, dass der User die Seite verlassen hat.

                            Comment


                            • #15
                              Originally posted by Snowflake View Post
                              Hey du hast recht sorry. Also es passiert einfach nichts, wenn ich deine Funktion + Logout Datei gegen meine tausche.
                              Es ist wie vorher. Ich werde weder umgeleitet noch passiert sonst etwas.
                              Die Seite wird einfach neu geladen wie vorher und das war es. Keine Umleitung auf logout.php
                              Also nochmal zum Verständniss was ich bezwecken will:
                              • Der Event onunload löst ganz normal den SJAX-Request auf go_logout.php aus. Das steht in meiner Funktion auch so drin und ist kein Verschreiber!
                              • Zusätzlich wird danach über location.href die Zielseite auf ein neues Script logout.php gesetzt.
                              • In logout.php wird nochmal explizit die Session zerstört und der Cookie gelöscht.
                              • Anschließend veranlasst logout.php mit header('Location: index.php'); den Browser dazu, die index.php wieder zu laden (redirect).
                              • Wenn jetzt die index.php abgerufen wird, muß die Session zwingend zerstört und der Cookie gelöscht sein, ansonsten spielen dir irgendwelche Caching- oder Proxy-Mechanismen einen Streich. Die doppelte Umleitung index.php -> onunload -> logout.php -> index.php ist für den Nutzer transparent. Er merkt normalerweise nicht das zwischenzeitlich eine logout.php geladen wurde.


                              Ansonsten hast du recht, daß ich dir per Ferndiagnose - und wenn du es nicht schaffst mal zu protokolieren in welcher Reihenfolge denn welches Script tatsächlich aufgerufen wird (HttpFox) - nicht mehr viel weiterhelfen kann.

                              Gruß Falk
                              Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                              Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                              Comment

                              Working...
                              X