Przekierowanie sesji Joomla-> isActive () i limit czasu sesji nie działa

9

Próbuję przekierować moją stronę na stronę główną, gdy sesja wygasa, a użytkownik jest automatycznie wylogowywany (w tej chwili zostaje przekierowany na stronę rejestracyjną rdzenia joomla, której nie chcę, aby użytkownik widział, ponieważ utworzyłem własną) strona rejestracji w komponencie niestandardowym).

W pliku index.php mojego szablonu sprawdzam, czy sesja jest aktywna i wykonuję przekierowanie, jeśli sesja wygasła:

$session = JFactory::getSession();

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

To rozwiązanie działało dobrze do momentu aktualizacji do Joomla 3.4.5. Po aktualizacji, nawet gdy użytkownik jest automatycznie wylogowany, zachowuje się tak, jakby sesja była nadal aktywna (sprawdzam, że poprzez echo linii „sesja jest aktywna”, jak widać powyżej).

Dlaczego sesja jest nadal aktywna, nawet jeśli użytkownik jest wylogowany? Czy istnieje alternatywa dla metody $ session-> isActive ()?

użytkownik3716433
źródło

Odpowiedzi:

7

Jeśli spojrzysz na plik session.php, zobaczysz następujące informacje:

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

Którą funkcję wywołujesz. Nie jestem pewien, czy zrobiono to celowo, czy był to błąd, ale zawsze to powróci 1.

Zamiast tego używasz:

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

Który zwróci jeden, jeśli:

  • nieaktywny
  • aktywny
  • przedawniony
  • zniszczony
  • błąd

Następnie możesz ifna tym oprzeć swoje oświadczenie, na przykład:

$session = JFactory::getSession();

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

Na marginesie, sugerowałbym użycie JFactory::getApplication()->redirect()metody Joomla zamiastheader()

Mam nadzieję że to pomoże

Lodder
źródło
Dzięki wielkie !! Właśnie tego szukałem. Działa idealnie! Dzięki jeszcze raz ! :)
user3716433,
@ user3716433 - Nie ma za co. Proszę zaznaczyć odpowiedź jako zaakceptowaną, klikając ikonę „tik”
Lodder
return (bool) ($ this -> _ state == 'active'); nie zawsze zwraca 1, zwraca „prawda”, jeśli $ this -> _ stan jest „aktywny”, w przeciwnym razie zwraca fałsz. Nie rozumiem, dlaczego twój kod działa, a kod początkowy nie !? Po prostu ciekawy ... $ session-> getState ()! == 'active' daje takie same wyniki jak! $ Session-> isActive ()
fruppel
@fruppel - Właśnie przetestowałem tę funkcję na stronie Joomla 3.4.5 i zawsze wraca 1, nawet myślałem, że powinna zwrócić wartość logiczną
Lodder
Ok, dziękuję też to sprawdzić. Może to błąd
fruppel,