Lo que te pasa a ti, también me ha pasado a mi. Me volvía loco preguntándome por qué se creaba sesiones nuevas, si los archivos de las
cookies y de las sesiones estaban presentes...
Unas veces eran debidos a que no indica el tiempo de vida de la sesión, o el tiempo de supervivencia de la
cookie, otras veces porque no indicaba bien la ruta al directorio de sesiones... En fin, son cosas variadas.
Entonces, no queda más remedio que leerse
el tutorial, pero... al principio está lleno de "trampas".
Por ejemplo, dedica tiempo a hablarte de 'CGISESSID', pero en realidad, no necesitas indicar nada en tu programa, porque ese es el valor por defecto que quieres y que vas a usar. Así que, aunque en el
tutorial habla mucho de cómo recuperar ese nombre o como cambiarle o cómo usarle, al final, no importa.
Otra trampa es la sección
Getting Started. Se supone que ahí vienen los pasos para crear una sesión o leer una sesión, pero en realidad nos lía mucho, porque se entretiene en explicar cómo crear una sesión, cuando en realidad lo que nos interesa es cómo acceder a una sesión ya creada.
Y lo mismo, más tarde, habla de cómo crear la
cookie, de cómo enviarla al usuario, etc... cuando todo se reduce a una línea (que también pone al final de la sección).
Resumen: dado un cgi en Perl que hace uso del módulo CGI, para tener soporte de sesiones con CGI::Session, solo hay que poner estas líneas al principio:
Using perl Syntax Highlighting
my $cgi = new CGI
; # nuevo objeto CGI
my $session = new CGI
::Session(undef, $cgi, { Directory
=>"/tmp" } ); # nuevo objeto CGI::SessionColoreado en 0.001 segundos, usando
GeSHi 1.0.8.4
y luego, a la hora de sacar los datos en la ventana del navegador del usuario, acordarse de cambiar la línea
Using perl Syntax Highlighting
$cgi->header();Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
por
Using perl Syntax Highlighting
$session->header();Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Nada de 'CGISESSID', nada de
cookies.
¡Ojo!, que en algunos ejemplos verás que en vez de usar
new CGI::Session usan
CGI::Session->load(), como en
el ejemplo del propio autor:
Using perl Syntax Highlighting
my $session = CGI
::Session->load() or die CGI
::Session->errstr;Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Los dos hacen lo mismo: cargan una sesión si ya existe, pero en el caso de new(), además, la crea de forma automática en caso de que no existiese. Según lo que quieras hacer, deberás usar una u otra. Por ejemplo, querrás que el usuario se identifique antes de pasar al resto de la aplicación, así que puedes hacer un load(), y si falla, saltar al formulario de registro. O si es el caso de que no hay identificación, y que quieres que haya control de sesión en todo momento, pues usas new(). El último ejemplo enlazado antes es bastante bueno.
Y lo más insidioso: hay una página que se llama
CGI::Session::CookBook, que solo está en una distribución antigua de CGI::Session, y que si no sabes cómo se llama, no la ves. En ese documento vienen cinco escenarios típicos, y que seguro que alguno de ellos se ajusta a lo que quieres hacer. Pero... recuerda que es un documento antiguo, por lo que algunas cosas han cambiado (sobre todo, hay nuevas funciones que ahorran código, como lo del $session->header).
Una cosa muy importante...
Si estás usando el módulo CGI, no necesitas NADA del código que tienes puesto entre las líneas 53 a 76... porque TODO eso ya lo hace la línea 37. Mejor dicho, la sola creación del objeto $cgi ya es suficiente para que CGI.pm extraiga el QUERY_STRING o lea desde la entrada estándar, parta la información por el delimitador '&', convierta los '+' en espacios, realice la conversión de caracteres codificados en la forma %XX, etc... Todo eso ya lo hace CGI.pm de forma automática. Tu solo tienes que poner la línea 37 para acceder a todos los argumentos que el usuario te pasa. Es más: ni siquiera te hace falta llamar a Vars(). Con ir llamando a param() con el nombre del argumento que quieres leer, te vale (siempre y cuando te sepas los nombres de todos los argumentos, claro).
Tienes otro artículo aquí (en inglés), con un buen resumen de todo esto, aunque sea de hace 9 años