• 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 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

Publicidad

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.003 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

Re: Control de acceso CGI::Session

Notapor noa86 » 2011-03-29 17:49 @784

He reiniciado el ordenador y me ha dejado de dar ese error.

Pero poniéndolo como hemos comentado ahora sigue sin funcionarme is_expired(), y además me ha dejado de funcionar bien las sesiones, ya que cada vez que ejecuto el cgi tengo que iniciar sesión, como si no me la guardara, y cuando tenía puesto el new() una vez iniciada sesión no tenía que volver a iniciar a no ser que cerrara el navegador o expirara el tiempo...
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:57 @789

Claro, como ves en el código de ejemplo del load(), si la sesión está vacía, es cuando se debe crear una nueva sesión con new().

De todas maneras, hay varias formas de controlar esto. No hay porqué seguir el orden impuesto por los manuales, aunque casi siempre tengan razón.

¿No puedes reducir tu código a la mínima expresión, para publicarlo aquí, entero? Quita todo lo que no sea necesario y deja solo la parte de inicio del programa.
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 18:40 @820

Ahora mismo tengo el código así. ¿Sería correcto como he programado lo referente a control de sesiones? Sigo sin saber por qué no me funciona el método is_expired().

Necesito una solución...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. require("wei.conf.perl");
  4.  
  5. use DBI;
  6. use CGI::Session;
  7. use CGI ':standard';
  8. use CGI::Carp qw'fatalsToBrowser warningsToBrowser';
  9.  
  10. my $cgi = CGI->new();
  11.  
  12. $dbh = DBI->connect( "DBI:mysql:$bd:localhost", $user, $passwd )
  13.     or die( "Can't connect to db: ", $dbh->errstr );
  14. my $session = CGI::Session->load( "driver:MySQL", $cgi, { Handle => $dbh } )
  15.     or die CGI::Session->errstr();
  16.  
  17. if ( $session->is_expired ) {
  18.     print $cgi->start_html(),
  19.         $cgi->p("Your session timed out!"),
  20.         $cgi->end_html();
  21.     exit(0);
  22. }
  23.  
  24. if ( $session->is_empty ) {
  25.     $session = CGI::Session->new( "driver:MySQL", $cgi, { Handle => $dbh } );
  26.     $session->expire(10);
  27. }
  28.  
  29. print $session->header;
  30.  
  31. if ( not $session->param('~registrado') )
  32. {                                      # si el usuario no está registrado
  33.  
  34.     if ( my $nombre = $cgi->param('login_nombre') ) {
  35.         my $passwd = $cgi->param('login_passwd');
  36.  
  37.         if ( usuario_registrado( $nombre, $passwd ) ) {
  38.             $session->param( 'nombre',      $nombre );
  39.             $session->param( '~registrado', 1 );
  40.         }
  41.         else {
  42.             presenta_login('Usuario desconocido');
  43.             exit;
  44.         }
  45.     }
  46.     else {
  47.         presenta_login('Identifiquese');
  48.         exit;
  49.     }
  50. }
  51.  
  52. if ( $cgi->param('Desconectar') ) {
  53.     $session->clear( ['~registrado'] );
  54.  
  55.     print
  56.         start_html('Desconexión'),
  57.         h2('Se ha desconectado'),
  58.         hr(),
  59.         p("Adios, $nombre"),
  60.         end_html();
  61. }
  62. else {
  63.     print
  64.         start_html('Bienvenido'),
  65.         h2('Bienvenido'),
  66.         hr(),
  67.         p( "Bienvenido", $session->param('nombre') ),
  68.         hr(),
  69.         p( a( { -href => $cgi->url() . '?Desconectar=1' }, 'Desconectar' ) ),
  70.  
  71.         end_html();
  72.  
  73.     #continuación de pagina.
  74. }
  75.  
  76. sub usuario_registrado {
  77.     ...;
  78. }
  79.  
  80. sub presenta_login {
  81.     ...;
  82. }
  83.  
  84.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Última edición por noa86 el 2011-03-31 14:19 @638, editado 1 vez en total
noa86
Perlero nuevo
Perlero nuevo
 
Mensajes: 93
Registrado: 2010-11-15 14:43 @655

Re: Control de acceso CGI::Session

Notapor noa86 » 2011-03-31 08:17 @386

¿Nadie sabe por qué puede ser que no me funcione is_expired?
noa86
Perlero nuevo
Perlero nuevo
 
Mensajes: 93
Registrado: 2010-11-15 14:43 @655

Re: Control de acceso CGI::Session

Notapor explorer » 2011-03-31 09:58 @456

¿Para qué está la línea 17? ¿No vale con la 31?
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 4 invitados

cron