Ankündigung

Einklappen
Keine Ankündigung bisher.

Session Timeout während eines Ajax-Request - Verständnisfrage

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Session Timeout während eines Ajax-Request - Verständnisfrage

    Hallo zusammen,

    ich bastle gerade an einem Session-Timeout für einen Administrationsbereich, in dem über Ajax eine Datenbank abgefragt wird, z.B. Spaltensortierung.

    Ich habe nun primär eine Verständnisfrage zu Sessions in PHP in Verbindung mit Ajax.

    Auf meiner Hauptseite (admin.php) habe am Anfang folgenden Code:
    PHP-Code:
    <?php
        session_start
    ();
        
    $logout_time 10//zu Testzwecken auf 10 Sek.
        
    if(empty($_POST['user']) || empty($_POST['pw'])){
            
    $_SESSION["errorMessage"] = "Login nicht erfolgreich.";
            
    header("Location: login.php");
            exit();
        } else {
           
    $user $_POST['user']; 
           
    $pw $_POST['pw'];
           
    $pw_hash password_hash('Passwort'PASSWORD_DEFAULT);  
           if (
    $user == "admin" && password_verify($pw$pw_hash)) {  //Nutzername, Passwort und Session-ID werden später noch geändert
               
    $_SESSION['login'] = 1;
           }
        }
        if(
    $_SESSION['login'] != 1){
            
    $_SESSION["errorMessage"] = "Login nicht erfolgreich.";
            
    header("Location: login.php");
            exit();
        }
        
    $now time();
        if(isset(
    $_SESSION["logout_time"]) && $now $_SESSION["logout_time"]){
            
    session_unset();
            
    session_destroy();
            
    session_start();
            
    $_SESSION["errorMessage"] = "Ihre Sitzung ist abgelaufen. Bitte melden Sie sich erneut an.";
            
    header("Location: login.php");
            exit();
        }
        
    $_SESSION["logout_time"] = $now $logout_time;
    ?>
    Dann folgt der Code, um die Tabelle zu initalisieren.

    Der Ajax-Request ruft die Seite getTable.php auf, die die aktualisierte Tabelle (z.B. sortiert) liefert. Diese wird in den Tabellenbereich eingespeist.

    getTable.php beginnt mit folgendem Code:
    PHP-Code:
        session_start();
        
    $logout_time 10//zu Testzwecken auf 10 Sek.

        
    $now time();
        if(
    $_SESSION['login'] != 1){
            
    $_SESSION["errorMessage"] = "Login nicht erfolgreich.";
            
    header("Location: login.php");
            exit();
        }
        if(isset(
    $_SESSION["logout_time"]) && $now $_SESSION["logout_time"]){
            
    session_unset();
            
    session_destroy();
            
    session_start();
            
    $_SESSION["errorMessage"] = "Ihre Sitzung ist abgelaufen. Bitte melden Sie sich erneut an.";
            
    header("Location: login.php");
            exit();
        }
        
    $_SESSION["logout_time"] = $now $logout_time
    Ich habe soweit schon mal verstanden, dass ich über Ajax keinen richtigen Redirect über einen Header machen kann, aber darum geht es gerade nicht. Was mich beschäftigt ist Folgendes:

    Wenn ich einen Ajax-Request auslöse und die Session abgelaufen ist, erscheint im Tabellen-Bereich korrekterweise die login.php mit dem Text "Ihre Sitzung ist abgelaufen..." Wenn ich dann jedoch einen Refresh der ganzen Seite ausführe, bin ich auf der admin.php wieder ganz normal eingeloggt und kann weiter arbeiten!

    Frage: Warum haben "session_unset()" und "session_destroy" keine Auswirkung auf die Hauptseite??

    Vielen Dank im Voraus, jede Hilfe dient mir zum Verständnis. Bin natürlich auch für weitere Tipps offen, Ziel wäre es eigentlich, bei einem Ajax-Request mit abgelaufener Zeit einen echten Redirect auf die login.php hinzubekommen...

    Viele Grüße

    Lars

  • #2
    Schon mal in die HTTP-Requests geschaut, welche Session-IDs da gesendet werden? Und auch mal ins PHP Error-Log geschaut, ob vielleicht ein Fehler auftritt?

    Im PHP-Handbuch steht übrigens:
    Hinweis:

    Verwenden Sie session_unset() nur bei veraltetem Code, bei dem nicht $_SESSION benutzt wird.
    https://www.php.net/manual/de/functi...on-destroy.php

    Das würde ich berücksichtigen.

    Kommentar


    • #3
      was bringt ein
      PHP-Code:
       header("Location: login.php"); 
      in einem einem ajax request ?

      Kommentar


      • #4
        Zitat von hellbringer Beitrag anzeigen
        Schon mal in die HTTP-Requests geschaut, welche Session-IDs da gesendet werden? Und auch mal ins PHP Error-Log geschaut, ob vielleicht ein Fehler auftritt?

        Im PHP-Handbuch steht übrigens:

        https://www.php.net/manual/de/functi...on-destroy.php

        Das würde ich berücksichtigen.
        Vielen Dank für die sehr höfliche Variante von rtfm . Werde meine Hausaufgaben machen und log + manual studieren. session_unset() war zugegebenermaßen copy&paste...

        Kommentar


        • #5
          Zitat von tomBuilder Beitrag anzeigen
          was bringt ein
          PHP-Code:
           header("Location: login.php"); 
          in einem einem ajax request ?
          Bin Anfänger. Mein Gedanke war, dass ein Nutzer, der die Seite zu lange offen stehen lässt und eine Aktion (i.d.R. verbunden mit einem ajax request) vornimmt, wegen timeout auf die login-Seite geleitet wird. Dass das so nicht geht, ist mir inzwischen klar, habe aber den richtigen Weg noch nicht gefunden, deshalb habe ich das erstmal drin gelassen.

          Kommentar


          • #6
            (..)wegen timeout auf die login-Seite geleitet wird.
            wenn der nutzer ausgelogt ist, wird der ajax resuest kein 200 sondern ein 403 bekommmen -- hoffe ich.

            https://de.wikipedia.org/wiki/HTTP-Statuscode

            Kommentar


            • #7
              Typischer Fall von Wald und Bäumen. Mein Problem war nicht die Session, sondern dass ich mir bei einem Refresh der admin.php die User-Daten der Login-Seite neu geholt habe, weil ich von dieser direkt auf die Admin-Seite verwiesen habe. Somit wurde jedesmal die $_SESSION['login'] neu gesetzt. Die Überprüfung des Timeouts fand dagegen nicht statt, weil ich in der getTable.php die $_SESSION["logout_time"] geleert habe und die Überprüfung somit gar nicht erst stattgefunden hat.

              Habe jetzt eine processing-Seite dazwischen gesetzt und alles ist gut, Ablauf also login.php (Eingabe von Benutzername und Passwort) --> login_process.php (Überprüfung und ggf. setzen der $_Session['login'] --> admin.php über header("Location...").

              Was die Sessions angeht (meine eigentliche Frage): Habe mich noch mal etwas reingelesen. Für meinen Fall reicht es ja eigentlich, die ausschlaggebende $_SESSION['login'] zu leeren. Die Session selber kann ja dann bestehen bleiben. Genau das mache ich jetzt:
              PHP-Code:
                  if(isset($_SESSION['logout_time']) && $now $_SESSION['logout_time']){
                      unset(
              $_SESSION['login']);
                      unset(
              $_SESSION['logout_time']);
                      
              $_SESSION["errorMessage"] = "Ihre Sitzung ist abgelaufen. Bitte melden Sie sich erneut an.";
                      
              header("Location: login.php");
                      exit();
                  } 
              Im eigentlich Logout (über einen Button) folge ich dann der Empfehlung des Manuals mit:
              PHP-Code:
              <?php
                  session_start
              ();
                  
              $_SESSION = array();
                  if (
              ini_get("session.use_cookies")) {
                      
              $params session_get_cookie_params();
                      
              setcookie(session_name(), ''time() - 42000,
                          
              $params["path"], $params["domain"],
                          
              $params["secure"], $params["httponly"]
                      );
                  }
                  
              session_destroy();
                  
              header("Location: login.php");
              ?>

              Vielen Dank für die Beiträge. Falls noch jemand einen heißen Tip hat, wie ich bei einem Ajax-Request nach dem Timeout direkt auf die login-Seite routen kann, immer her damit.

              Viele Grüße

              Lars

              Kommentar


              • #8
                Zitat von ringline Beitrag anzeigen
                Falls noch jemand einen heißen Tip hat, wie ich bei einem Ajax-Request nach dem Timeout direkt auf die login-Seite routen kann, immer her damit.
                Mit JavaScript:
                Code:
                document.location.href = 'http://example.org/login';

                Kommentar


                • #9
                  so richg verstaden was wo gellert und weitregeitet wird hab ich nicht verstaden, muss ich mal aufmalen.
                  ajax kommt bei dir ja gar nicht mehr vor, insofern kann ich da auch kiene konkrete frage erkennen.
                  den status code abfangen ggf loginfenster einblenden ist da wohl eine möglickeit

                  Kommentar


                  • #10
                    Zitat von tomBuilder Beitrag anzeigen
                    so richg verstaden was wo gellert und weitregeitet wird hab ich nicht verstaden, muss ich mal aufmalen.
                    ajax kommt bei dir ja gar nicht mehr vor, insofern kann ich da auch kiene konkrete frage erkennen.
                    den status code abfangen ggf loginfenster einblenden ist da wohl eine möglickeit
                    Mein ursprüngliches Anliegen (Sessions verstehen) ist erledigt, Hinweis auf das Manual hat mir schon geholfen und letztlich lag der Fehler nicht im Session-Handling sondern im restlichen Code, was ich versucht habe, so kurz wie möglich zu erklären. Aufmalen musst du dir wegen mir nichts, sollte es wirklich noch von Interesse sein, kann ich es mal aufgliedern. Für mich passt meine Lösung jetzt soweit.

                    Ajax kommt bei mir schon noch vor, gehört aber wenn dann in einen neuen Thread. Mein Anliegen habe ich formuliert und ja auch Tipps bekommen, vielen Dank dafür.

                    --> Thema erledigt

                    Kommentar

                    Lädt...
                    X