Joomla Session-> isActive () & Session Timeout Redirect funktioniert nicht

9

Ich versuche, meine Website auf die Startseite umzuleiten, wenn die Sitzung abläuft und der Benutzer automatisch abgemeldet wird (im Moment wird sie auf die Joomla Core-Registrierungsseite umgeleitet, die der Benutzer nicht sehen soll, weil ich meine eigene erstellt habe Registrierungsseite in einer benutzerdefinierten Komponente).

In der Datei index.php meiner Vorlage überprüfe ich, ob die Sitzung aktiv ist, und führe eine Umleitung durch, wenn die Sitzung abgelaufen ist:

$session = JFactory::getSession();

if (!$session->isActive()) {
   echo "session is expired";   
   header('Location: http://www.example.com/');
   exit;
 }else{
   echo "session is active";
 }

Diese Lösung funktionierte bis zu dem Moment, als ich auf Joomla 3.4.5 aktualisiert habe. Selbst wenn der Benutzer nach dem Update automatisch abgemeldet wird, verhält es sich so, als ob die Sitzung noch aktiv ist (ich überprüfe dies über das Echo "Sitzung ist aktiv", wie Sie oben sehen können).

Warum ist die Sitzung auch dann noch aktiv, wenn der Benutzer abgemeldet ist? Gibt es eine Alternative zur Methode $ session-> isActive ()?

user3716433
quelle

Antworten:

7

Wenn Sie sich die Datei session.php ansehen, sehen Sie Folgendes:

public function isActive()
{
    return (bool) ($this->_state == 'active');
}

Welches ist die Funktion, die Sie aufrufen. Ich bin nicht sicher, ob dies absichtlich gemacht wurde oder ob es ein Fehler war, aber es wird immer zurückkehren 1.

Stattdessen verwenden Sie:

$session = JFactory::getSession();
echo $session->getState();

Welches wird eine zurückgeben, wenn die folgenden:

  • inaktiv
  • aktiv
  • abgelaufen
  • zerstört
  • Error

Sie können Ihre ifAussage dann auf Folgendes stützen :

$session = JFactory::getSession();

if ($session->getState() !== 'active') 
{
    echo 'session is not active';   
    header('Location: http://www.example.com/');
    exit;
}
else
{
    echo 'session is active';
}

Nebenbei würde ich vorschlagen, JFactory::getApplication()->redirect()stattdessen die Joomla- Methode zu verwendenheader()

Hoffe das hilft

Lodder
quelle
Vielen Dank !! Genau das habe ich gesucht. Es hat perfekt funktioniert! Danke noch einmal ! :)
user3716433
@ user3716433 - Gern geschehen. Bitte markieren Sie die Antwort als akzeptiert, indem Sie auf das "Häkchen" -Symbol klicken
Lodder
return (bool) ($ this -> _ state == 'active'); gibt nicht immer 1 zurück, sondern "true", wenn $ this -> _ state "active" ist, andernfalls false. Ich verstehe nicht, warum Ihr Code funktioniert und der ursprüngliche Code nicht!? Nur neugierig ... $ session-> getState ()! == 'active' liefert die gleichen Ergebnisse wie! $ Session-> isActive ()
fruppel
@Fruppel - Ich habe diese Funktion gerade auf einer Joomla 3.4.5-Site getestet und sie kehrt immer zurück 1, obwohl ich dachte, sie soll einen Booleschen Wert zurückgeben
Lodder
Ok, danke, ich werde es auch überprüfen. Vielleicht ist es ein Bug
Fruppel