• Publicidad

CGI::Application::Plugin::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.

CGI::Application::Plugin::Session

Notapor silva » 2013-02-06 06:48 @325

Estoy queriendo utilizar CGI::APPLICATION::PLUGIN::SESSION con MySQL, pero no funciona. No guarda en la sesión las variables que quiero guardar.

Al ejecutarse el cgi_init la sesión se crea bien, abro la tabla y veo el registro con las variables inicializadas con el valor por defecto: exploración, etc..

Pero cuando, luego, desde otro lugar quiero guardar o recuperar variables no hace nada; tampoco tira error.

Sintáxis: [ Descargar ] [ Ocultar ]
  1. sub cgiapp_init { 
  2.  
  3.   my $self = shift; 
  4.  
  5.   my $q = $self->query(); 
  6.  
  7.   # Leo el archivo de configuración 
  8.   $self->cfg_file('../../MySitePrivate/config/config.pl'); 
  9.  
  10.    # Manejador base de datos 
  11.    $self->dbh_config( 
  12.       $self->cfg('db_dsn'), 
  13.       $self->cfg('db_user'), 
  14.       $self->cfg('db_pw') 
  15.    ) or die "error al conectar"; 
  16.     
  17.    # Sesiones  
  18.    $self->session_config( 
  19.     CGI_SESSION_OPTIONS => [  
  20.       $self->cfg('cgi_session_dsn'), 
  21.       $self->query, 
  22.       {Handle=>$self->dbh}  
  23.     ], 
  24.     DEFAULT_EXPIRY   => '+30m', # ("~logged-in", "30w") , no funciona       COOKIE_PARAMS    => { 
  25.        -expires => '+30m', 
  26.        -path  => $self->cfg('cookie_path') 
  27.     } 
  28.   ); 
  29. ..... 
  30. ...... 


Hasta aquí, veo el registro en la tabla sessions de MySQL.

En config.pl tengo configurado, para sesiones lo siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. #!c:/perl/bin/perl -w 
  2. use strict; 
  3. my %CFG; 
  4.  
  5. $CFG{app_name} = "Intranet"; 
  6. $CFG{site_url} = "http://localhost/cgi-bin/MySite"; 
  7. $CFG{db_dsn} = "dbi:mysql:intranet"; 
  8. $CFG{db_user} = "root"; 
  9. $CFG{db_pw} = "admin"; 
  10. $CFG{cgi_session_dsn} = "driver:mysql;serializer:Storable"; 
  11. $CFG{cookie_path} = '/'; 
  12. .... 
  13. .... 

Luego trato de guardar una variable por ejemplo en el método login
Sintáxis: [ Descargar ] [ Ocultar ]
  1. sub login{ 
  2.  
  3.   my $self = shift; 
  4.  
  5.   my $user = $self->authen->username; 
  6.   my $url = $self->query->url; 
  7.   my $q = $self->query(); 
  8.   my %e; 
  9.   my $dbh = $self->dbh; 
  10.     
  11.     $self->session->param(usu_id => 4); 
  12.     $self->session->param(usu_nombre => 'gimena'); 
  13.     $self->session->param(usu_apellido => 'apellido'); 


Luego trato de recuperarlas en otro método
Sintáxis: [ Descargar ] [ Ocultar ]
  1. sub conformar_menu { 
  2.    
  3.   my $self = shift; 
  4.   my $q = $self->query(); 
  5.   my $dbh = $self->dbh; 
  6.    
  7.   my $usu_id = $self->session->param('usu_id'); 
  8.  
  9. ..... 



Creo que es problema del Plugin y MySQL. ¿Qué puedo hacer? ¿Alguien se ha implementado lo mismo?

¡¡¡Gracias!!!
silva
Perlero nuevo
Perlero nuevo
 
Mensajes: 82
Registrado: 2011-05-24 05:59 @291

Publicidad

Re: CGI::Application::Plugin::Session

Notapor explorer » 2013-02-06 07:48 @367

Yo no he usado el CGI::Application::Plugin::ConfigAuto, pero, si las condiciones de inicio son iguales, debería poder acceder a la misma sesión. Eso sí: la identificación del usuario debe ser la misma, bien sea por medio de algún id almacenado en la URL, o por medio de las cookies. Si la galleta es la misma, CGI::Session debe poder acceder a la misma sesión (y el proceso de inicialización de CGI::Application sea el mismo).

Un detalle: fíjate que tienes comentada la línea de definición COOKIE_PARAMS.

Muchas veces he tenido que usar herramientas externas para vigilar la creación de sesiones, ya que me pasaba lo mismo, pero no con MySQL, sino con sesiones creadas con el controlador 'driver:File'. Me faltaba indicar la opción SEND_COOKIE => 1 en la llamada a session_config(). Aunque en la documentación pone que es 'true' por defecto, hasta que no lo puse no funcionó. Bueno, también es cierto que no leí bien la documentación: la galleta se envía si en algún momento se llamó al método session(), porque si no, no se crea la sesión o no se inicializa.
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: CGI::Application::Plugin::Session

Notapor silva » 2013-02-06 10:02 @459

Gracias, persiste el problema. Cambié la tabla MySQL por 'file', lo mismo.

Qué he detectado: Si guardo variables en la sesión dentro del propio cgi_init, SE GUARDAN perfectamente con ambas metodologías: base de datos o 'file'.

No sucede lo mismo cuando lo hago desde otro método.

Sintáxis: [ Descargar ] [ Ocultar ]
  1. sub cgiapp_init { 
  2.  
  3.   my $self = shift; 
  4.  
  5.   my $q = $self->query(); 
  6.  
  7.   # Leo el archivo de configuracion 
  8.   $self->cfg_file('../../MySitePrivate/config/config.pl'); 
  9.  
  10.    # Manejador base de datos 
  11.    $self->dbh_config( 
  12.       $self->cfg('db_dsn'), 
  13.       $self->cfg('db_user'), 
  14.       $self->cfg('db_pw') 
  15.    ) or die "error al conectar"; 
  16.     
  17.    # Sesiones  
  18.    $self->session_config( 
  19.     CGI_SESSION_OPTIONS => [  
  20.       $self->cfg('cgi_session_dsn'), 
  21.       $self->query, 
  22.       {Handle=>$self->dbh}], 
  23.     # CGI_SESSION_OPTIONS => [ "driver:File", $self->query, {Directory=>'C:\sesiones_tmp'} ], 
  24.     DEFAULT_EXPIRY   => '+30m',  
  25.     COOKIE_PARAMS    => { 
  26.        -expires => '+30m', 
  27.        -path  => $self->cfg('cookie_path') 
  28.     }, 
  29.     SEND_COOKIE => 1, 
  30.   ); 
  31.  
  32.   # Probando guardar variables en sesión, aquí funciona. 
  33.     $self->session->param(usu_id => 4); 
  34.     $self->session->param(usu_nombre => 'Juan'); 
  35.     $self->session->param(usu_apellido => 'Perez'); 
  36.      


No tengo idea de cuál será el problema, ¡¡Gracias!!
silva
Perlero nuevo
Perlero nuevo
 
Mensajes: 82
Registrado: 2011-05-24 05:59 @291

Re: CGI::Application::Plugin::Session

Notapor explorer » 2013-02-06 13:44 @614

Desde otros métodos, ejecutados por CGI::Application, se supone que antes habrá sido llamado cgiapp_init() (esto lo puedes comprobar poniendo un print a un archivo o al archivo de registro (log) de actividad. No lo hagas hacia la salida estándar).

Esta es una cgiapp_init() mía:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. ## Inicialización ----------------------------------------------------------------
  2. sub cgiapp_init() {  
  3.     my $self = shift;
  4.    
  5.     $query = $self->query;                      # creamos/leemos un objeto CGI
  6.     $query->charset('UTF-8');                   # salida siempre en utf8
  7.  
  8. # Problemas: cachea demasiado: no se da cuenta de que hay un usuario registrado
  9. #    $self->header_add( -expires => '+1m' );    # caché en el navegador del usuario
  10.  
  11.     # Caso de que sea una confirmación,
  12.     # el usuario nos manda la id de sesión con la que se registró
  13.     if ($self->get_current_runmode() eq 'confirmacion') {
  14.         my $sid = $self->param('n');
  15.         if ($sid) {
  16.             $query->param(-name => CGI::Session->name, -value => $sid, -override => 1);
  17.         }
  18.     }
  19.     else {                                      # en el resto de modos, es necesario abrir la hoja
  20.         $xls = ReadData($BASE_DE_DATOS, cells => 1, attr => 0);
  21.         die "ERROR: Base de datos no encontrada" if not $xls;
  22.         %xls_hojas = %{$xls->[0]{sheet}};       # Relación hojas -> índices
  23.     }
  24.  
  25.     # configuración de la sesión de usuario
  26.     $self->session_config(
  27.         CGI_SESSION_OPTIONS     => [ 'driver:File', $query, {Directory => "$DIRECTORIO_WEB/sesiones"} ],
  28.         DEFAULT_EXPIRY          => '+90d',
  29.         COOKIE_PARAMS           => { -expires => '+90d' },
  30.         SEND_COOKIE             => 1,
  31.     );
  32.  
  33.     $session = $self->session;
  34.  
  35.     $self->dbh_config($db_dsn, $db_user, $db_pass);
  36.  
  37. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Lo importante es esto:
  • en la línea 78 guardo el objeto CGI en $query. Allí estará todo lo que me llega del usuario, incluidas las galletas
  • las líneas 86 a 91 son algo especial: en caso de que la llegada a nuestra web haya sido porque el usuario ha pulsado en el enlace de confirmación que le enviamos por correo, en la propia URL viene un parámetro, que coincide con el número de sesión creado por la llamada a CGI::Session en la primera visita. Entonces, si se trata de una confirmación (86), leemos ese valor (87), y modificamos el objeto CGI con ese número de sesión (89). Esto es importante: si no hiciéramos esto, en el valor de sesión que -posiblemente- hemos leído antes en la 78, podríamos tener un número de sesión distinto del que el usuario usó en su primera visita. Y necesitamos que sea el mismo, porque grabé en esa sesión sus datos de registro. La línea imita la creación de una galleta con el nombre de CGISESSID, y de valor el que nos ha mandado el usuario al pulsar el enlace
  • luego, en la línea 99 a 104 creamos las condiciones de cómo son las sesiones. Y la clave está en la inclusión de $query: si no hay ninguna galleta, no hay número de sesión, así que se crea una nueva. Pero si hay un parámetro llamado CGISESSID, entonces no se crea una nueva sesión, sino que se accede a la antigua.
  • línea 106 : obtenemos el objeto CGI::Session. Lo metemos en una variable global para usarla en el resto del programa

Entonces, en tu programa, debes asegurarte que el método que quiere acceder a una determinada sesión, ha conseguido 1) recuperar el número de sesión desde el usuario, bien a través de la URL o con una galleta, y 2) que coincide con su número de sesión anterior.

Pufff... no creas que esto es sencillo: he tenido que dedicarle horas a entender el flujo de datos, y a tener varias ventanas abiertas, mostrando el listado de archivos de sesión, y qué es lo que contenían, para comprobar que todo funcionaba bien...

Eso sí: cuando te lo aprendes, luego hacer sitios web basados en este entorno de trabajo se hace más fácil (bueno, hoy en día hay soluciones más condensadas).

¡Ah!, y queda por hacer un script que se dedique exclusivamente al borrado de las sesiones caducadas...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. #
  3. # Purgado de sesiones caducadas.
  4. #
  5. # Se hace aquí para no cargar la CPU con el cgi de la aplicación.
  6. # Se ejecuta desde un cron.
  7. #
  8. # Joaquín Ferrero. 20110802
  9. #
  10.  
  11. use CGI::Session;
  12.  
  13. CGI::Session->find(
  14.     'driver:File',
  15.     sub {},
  16.     {
  17.         Directory => '/home/sitioweb/sesiones',
  18.     }
  19. );
  20.  
  21. __END__
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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


Volver a Módulos

¿Quién está conectado?

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