variables de sesión no funcionan despues de destruir la sesión

Iniciado por gAb1, 10 Junio 2015, 01:26 AM

0 Miembros y 1 Visitante están viendo este tema.

gAb1

Hola buenas, necesito crear variables de sesión despues de que la sesión haya sea destruida (por inactividad), para imprimir un mensaje y para saber a que url redireccionar.

La página platform requiere que estes logueado para mostrarse, si no es el caso redirecciona automaticamente a login y al loguear detecta que session url esta declarada entonces en lugar de redireccionar a la web por defecto (la principal) redirecciona a la página platform.

Mi funcion session_start destruye la sesion cuando pasan 5 minutos sin actividad:

Código (php) [Seleccionar]
$hasExpired = NULL;

if (isset($_SESSION['client_id'], $_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY']) > 300) {
// last request was more than 5 minutes ago
$_SESSION = array();                    // unset $_SESSION variable for the run-time
$params = session_get_cookie_params();  // Get session parameters
setcookie(session_name(),               // Delete the actual cookie
 '',
 time() - 3600,
 $params["path"],
 $params["domain"],
 $params["secure"],
 $params["httponly"]);
session_destroy();                      // destroy session data in storage

$hasExpired = true;                     // now we know the user has lost his session for inactivity
}


Para avisar al usuario de que su sesión ha expirado y por esa razón se le ha redireccionado a la pagina login:

Código (php) [Seleccionar]
$hasExpired = $web_user::sec_session_start();

if ($hasExpired == true) {
$_SESSION['msg'] = 'msg_afk';  // no funciona
$_SESSION['url'] = 'platform';  // no funciona
die(header('Location: ' . $path_login));
}


En la página login se deberia mostrar el mensaje, pero no aparece ninguno porque la variable esta vacia... y tampoco redirecciona a la misma pagina de la que se le cerró la sesión.

Más abajo, en index.php, tengo otro header y ahí si que funciona la variable de sesión:

Código (php) [Seleccionar]
// if logged in == true
else {
   $_SESSION['url'] = 'platform'; // working
   die(header('Location: ' . $path_login));
} // if I log in again I'm redirected to platform


¿Alguna idea de por qué no funcionan las variables de sesión despues de destruirse la sesión?

Ya he probado a empezarla de nuevo antes de declarar las variables, pero nada...

Gracias!

MinusFour

No estoy muy seguro. Yo creo que después que destruyes la sesión, no puedes volver a guardar los datos en la sesión porque no hay ninguna activa, a menos que inicies una nueva sesión con session_start. Incluso el manual de PHP lo dice:

CitarTo use the session variables again, session_start() has to be called.

gAb1

Pues que cosa más extraña porque ya lo intenté, y de dos maneras:

Código (php) [Seleccionar]
if ($hasExpired == true) {
       $web_user::sec_session_start();
$_SESSION['msg'] = 'msg_afk';  // no funciona
$_SESSION['url'] = 'platform';  // no funciona
die(header('Location: ' . $path_login));
}


Y así:

Código (php) [Seleccionar]
if ($hasExpired == true) {
       session_start();
$_SESSION['msg'] = 'msg_afk';  // no funciona
$_SESSION['url'] = 'platform';  // no funciona
die(header('Location: ' . $path_login));
}


Pero voy a probar otra vez, a veces pasan cosas raras...  :rolleyes:

MinusFour

Yo creo que la sesión se esta perdiendo en algún lado, yo revisaría que la cookie exista.

gAb1

#4
Alomejor sabiendo como funciona todo te haces una idea:

Tengo un framework al que se conectan varias páginas (principal y subdominios). Todas las páginas (en index.php) empiezan la sesión de la misma manera:

Código (php) [Seleccionar]
$hasExpired = $web_user::sec_session_start();

Para que funcione la sesión en todos los subdominios, simplemente añado un punto delante del dominio, como dice en la documentación php.net:

Código (php) [Seleccionar]
$domain = '.domain.com';

Es extraño que no funcione, ya que he probado otra vez empezando la sesión, de las dos maneras esas...

¿Tal vez en los logs de php se puede ver que está pasando? Tendré que pedir acceso SSH...

Si esto no funciona, voy a tener que contemplar otra manera de saber si el usuario ha perdido la sesión por inactividad... aunque primero habrá que ver otra manera de pasar las variables a la página login (que no sea por get).

MinusFour

Es parte de un antiguo standard, los nuevos navegadores simplemente descartan el punto. Prueba a expirar la session normal y tu location ponlo así:

Código (php) [Seleccionar]

die(header('Location: ' . $path_login . '?' . htmlspecialchars(SID)));

gAb1

Nada, tampoco funcionan asi. Puse un print $_SESSION['msg'] . $_SESSION['url']; en la pagina login pero da undefined index...

De todas maneras, y pensadolo mejor, creo que será mejor poner una página entera para mostrar el mensaje de afk y explicar el motivo de la desconexión que redirigir y mostrar un simple jquery notify.

Pero seria interesante descubir el por que... hehehe

Voy a probar con la versión más reciente de PHP, ahora mismo estoy usando la 5.4.41

MinusFour

Cita de: gAb1 en 10 Junio 2015, 18:28 PM
Nada, tampoco funcionan asi. Puse un print $_SESSION['msg'] . $_SESSION['url']; en la pagina login pero da undefined index...

De todas maneras, y pensadolo mejor, creo que será mejor poner una página entera para mostrar el mensaje de afk y explicar el motivo de la desconexión que redirigir y mostrar un simple jquery notify.

Pero seria interesante descubir el por que... hehehe

Voy a probar con la versión más reciente de PHP, ahora mismo estoy usando la 5.4.41

¿La pagina a la que te redirecciona te esta dando una id (la URL)?

gAb1

#8
No, solo sale ?, pero nada más. La sesión empezada otra vez, como en los dos ejemplos de arriba.

Así:

Código (php) [Seleccionar]
    if ($hasExpired == true) {
            /*$web_user::sec_*/session_start();  // de las dos maneras
    $_SESSION['msg'] = 'msg_afk';  // no funciona
    $_SESSION['url'] = 'platform';  // no funciona
        die(header('Location: ' . $path_login . '?' . htmlspecialchars(SID)));
    }

MinusFour

Pues eso es un indicador que no hay una sesión activa y probablemente tu session_start no llega a iniciar la sesión. ¿No hay ningún error arrojado? ¿Tienes display_errors activado y error_reporting en E_ALL?