Página 2 de 3

Re: Control de acceso CGI::Session

NotaPublicado: 2011-03-29 11:14 @509
por noa86
He modificado cosas del código que me aportó explorer y me funciona perfectamente, pero ahora quiero poner tiempo de expiración. Me expira poniendo $session->expire('+5m'), por ejemplo, pero no me sale ningún mensaje. Mirando tutoriales he realizado esto.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. ## Creamos el objeto CGI
  2. my $cgi = CGI->new();  
  3.  
  4. ## Creamos el objeto CGI::Session
  5. $dbh = DBI->connect("DBI:mysql:$database:localhost",$user,$passwd) or die("Can't connect to db: ",$dbh->errstr);
  6. my $session = CGI::Session->new("driver:MySQL", $cgi, {Handle=>$dbh})    or die CGI::Session->errstr;
  7.  
  8. ## Enviamos la cookie de sesión al usuario
  9. print $session->header;
  10.  
  11.  
  12. my $perfil;
  13.  
  14.  
  15. ## Inicialización
  16. if ( not $session->param('~registrado') ) {     # si el usuario no está registrado
  17.    
  18.    $session = CGI::Session->load("driver:MySQL", $cgi, {Handle=>$dbh}) or die CGI::Session->errstr();
  19.  
  20.         if ( $session->is_expired){
  21.            print $session->header(),
  22.                 $cgi->start_html(),
  23.                 $cgi->p("Your session timed out! Refresh the screen to start new session!"),
  24.                 $cgi->end_html();
  25.                 exit(0);
  26.    }
  27.  
  28.         if ($session->is_empty){
  29.                 $session = $session->new("driver:MySQL", $cgi, {Handle=>$dbh}) or die $session->errstr;
  30.                 $session -> expire('+2m');
  31.         }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


No sé si estoy poniendo correctamente las líneas de load() y new() o qué tengo mal pero cuando me expira el tiempo, me vuelve a identificación de usuario pero no me muestra aviso de que ha expirado el tiempo...


Gracias de antemano...

Re: Control de acceso CGI::Session

NotaPublicado: 2011-03-29 11:37 @526
por explorer
Viendo el código, si no se ejecuta $session->is_expired, cuando sabemos que la sesión ha expirado, es quizás porque en la línea 16 sí que ha encontrado el parámetro '~registrado'.

Quizás debas cambiar el orden... Deberías, primero, comprobar si la sesión ha expirado o no. Y luego, si no ha expirado, preguntar si está registrado o no.

Editado: veo en el CGI::Session, en la explicación de expire(), que también se puede asociar un tiempo de expiración para un determinado argumento, así que, también, podrías escribir $session->expire('~registrado', '+10m'), y de esa manera, cuando pasen 10 minutos, el parámetro '~registrado' es eliminado de la $session, y la línea 16 funcionará.

Re: Control de acceso CGI::Session

NotaPublicado: 2011-03-29 12:02 @543
por noa86
Lo he puesto
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. ## Inicialización
  2. $session = CGI::Session->load("driver:MySQL", $cgi, {Handle=>$dbh}) or die CGI::Session->errstr();
  3. if ( $session->is_expired){
  4.            print $session->header(),
  5.                 $cgi->start_html(),
  6.                 $cgi->p("Your session timed out! Refresh the screen to start new session!"),
  7.                 $cgi->end_html();
  8.                 exit(0);
  9.    }
  10.  else{
  11. if ( not $session->param('~registrado') ) {     # si el usuario no está registrado
  12.  
  13.         if ($session->is_empty){
  14.                 $session = $session->new("driver:MySQL", $cgi, {Handle=>$dbh}) or die $session->errstr;
  15.                 $session -> expire('+2m');
  16.         }
  17. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

pero tampoco me funciona. Sí que me expira, pero no me da el mensaje de is_expired().

¿En el load() y en el new() tengo que poner "driver:MySQL", $cgi, {Handle=>$dbh}, no? Ya que las sesiones se me guardan en la base de datos...

Re: Control de acceso CGI::Session

NotaPublicado: 2011-03-29 12:39 @569
por explorer
$dbh es la variable donde has guardado la conexión con la base de datos, así que unas líneas antes has debido abrir esa conexión (línea 5). Y sí, debes cargar la sesión con load().

El problema que veo, en el primero código que has publicado, es que has creado la sesión en la línea 6, envías el header() en la línea 9, y luego vienen las líneas que preguntan si la sesión ha expirado. Ahí sí que hay un error: la sesión no está expirada porque acabas de crearla en la línea 6.

Y otro detalle... envías dos veces los header(): en la línea 9 y en la línea 21.

Entonces... para mí sobran esas dos primeras líneas, la 6 y la 9.

Recuerda que puedes usar la función dump() para ver el contenido de la sesión, pero fíjate bien dónde colocas esa llamada: debe estar después de la ejecución de header(). Lo normal es ponerlo justo antes de enviar el end_html().

Estoy buscando a ver si veo un ejemplo completo...

Re: Control de acceso CGI::Session

NotaPublicado: 2011-03-29 13:06 @588
por noa86
Pero si elimino la línea 9 no me carga la página... me da error

Re: Control de acceso CGI::Session

NotaPublicado: 2011-03-29 13:57 @623
por explorer
Vale, pues quita la línea 21.

Esa línea solo debería ejecutarse una vez, para la salida de la cabecera HTTP hacia el usuario.

Re: Control de acceso CGI::Session

NotaPublicado: 2011-03-29 14:30 @646
por noa86
Lo tengo ahora mismo así
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $dbh = DBI->connect("DBI:mysql:$database:localhost",$user,$passwd) or die("Can't connect to db: ",$dbh->errstr);
  2. my $session = CGI::Session->new();  #esta linea no la puedo eliminar por completo porque si no me da error print $session->header, ya que me dice que session no esta definido.
  3.  
  4. ## Enviamos la cookie de sesión al usuario
  5. print $session->header;
  6.  
  7. my $perfil;
  8.  
  9.  
  10. ## Inicialización
  11.  
  12. if ( not $session->param('~registrado') ) {     # si el usuario no está registrado
  13.    
  14.          $session = CGI::Session->load("driver:MySQL", $cgi, {Handle=>$dbh}) or die CGI::Session->errstr();
  15.  
  16.         if ( $session->is_expired){
  17.            print $cgi->start_html(),
  18.                 $cgi->p("Your session timed out! Refresh the screen to start new session!"),
  19.                 $cgi->end_html();
  20.                 exit(0);
  21.                 }
  22.  
  23.         if ($session->is_empty){
  24.                 $session = $session->new("driver:MySQL", $cgi, {Handle=>$dbh}) or die $session->errstr;
  25.                 $session -> expire('+1m');
  26.         }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sigue con el mismo problema, yo creo. Sigue sin salirme el mensaje de error... no entra en el if() de is_expired() pero sí en el de is_empty().

Re: Control de acceso CGI::Session

NotaPublicado: 2011-03-29 16:35 @733
por explorer
Repito lo dicho: el problema es la línea 2, en la que estás creando una nueva sesión. Por eso no indica que está expirada, pero sí vacía, porque se trata, precisamente, de una nueva sesión.

Pones en el código que necesitas de la línea 2 para poder hacer el print del header(). Pero no tiene por qué ser así...

Lo que puedes hacer es cambiar el new() por el load(), moviendo la línea 14 a la 2. De esa manera, tendrás creada la $session, podrás hacer print header() y podrás comprobar si está expirada o vacía.

Re: Control de acceso CGI::Session

NotaPublicado: 2011-03-29 16:53 @745
por noa86
Ya entiendo lo que me quieres decir, pero si hago lo que me dices me sale un error:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
load(): couldn't thaw() data using CGI::Session::Serialize::default: at /var/www/cgi-bin/wei/privat/wei.interfazedicion.perl
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


es decir, por lo que entiendo yo, ese error sale porque como no está creado CGI::Session (new()) no se puede hacer load().

Re: Control de acceso CGI::Session

NotaPublicado: 2011-03-29 17:02 @751
por explorer
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $session = CGI::Session->load("driver:MySQL", $cgi, {Handle=>$dbh}) or die CGI::Session->errstr();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sacado de la documentación de load() en CGI::Session.