• Publicidad

Control de acceso CGI::Session

Aquí encontrarás todo lo que sea específicamente acerca de módulos de Perl. Ya sea que estás compartiendo tu módulo, un manual o simplemente tienes una duda acerca de alguno.

Re: Control de acceso CGI::Session

Notapor noa86 » 2011-03-29 11:14 @509

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.004 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...
noa86
Perlero nuevo
Perlero nuevo
 
Mensajes: 93
Registrado: 2010-11-15 14:43 @655

Publicidad

Re: Control de acceso CGI::Session

Notapor explorer » 2011-03-29 11:37 @526

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á.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Control de acceso CGI::Session

Notapor noa86 » 2011-03-29 12:02 @543

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...
noa86
Perlero nuevo
Perlero nuevo
 
Mensajes: 93
Registrado: 2010-11-15 14:43 @655

Re: Control de acceso CGI::Session

Notapor explorer » 2011-03-29 12:39 @569

$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...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Control de acceso CGI::Session

Notapor noa86 » 2011-03-29 13:06 @588

Pero si elimino la línea 9 no me carga la página... me da error
noa86
Perlero nuevo
Perlero nuevo
 
Mensajes: 93
Registrado: 2010-11-15 14:43 @655

Re: Control de acceso CGI::Session

Notapor explorer » 2011-03-29 13:57 @623

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Control de acceso CGI::Session

Notapor noa86 » 2011-03-29 14:30 @646

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.002 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().
noa86
Perlero nuevo
Perlero nuevo
 
Mensajes: 93
Registrado: 2010-11-15 14:43 @655

Re: Control de acceso CGI::Session

Notapor explorer » 2011-03-29 16:35 @733

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Control de acceso CGI::Session

Notapor noa86 » 2011-03-29 16:53 @745

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().
noa86
Perlero nuevo
Perlero nuevo
 
Mensajes: 93
Registrado: 2010-11-15 14:43 @655

Re: Control de acceso CGI::Session

Notapor explorer » 2011-03-29 17:02 @751

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

AnteriorSiguiente

Volver a Módulos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados