Un momento... si estás usando CGI::Application, no te debería hacer falta cargar CGI ni CGI::Session.
Es decir:
- no te hace falta cargar CGI porque CGI::Application ya lo carga por defecto. Puedes acceder al objeto CGI por medio del método query(), tal como explica en el manual:
query()Using perl Syntax Highlighting
my $q = $webapp->query();
my $remote_user = $q->remote_user();Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Este método retorna el objeto
query de CGI.pm que fue creado al crear la instancia de tu módulo de aplicación. Para los detalles en el uso de este objeto
query, referirse a
CGI. CGI::Application se soporta sobre el módulo CGI. Generalmente hablando, querrá hacerse familiar con CGI.pm, porque usará el objeto
query siempre que quiera interactuar con datos provenientes de los formularios.
Cuando se llama al método new(), un objeto CGI
query se crea automáticamente. Si, por alguna razón, quiere usar su propio objeto CGI
query, el método new() soporta la opción de pasárselo usando el atributo QUERY.
Hay unas raras situaciones donde quizás quiera usar su propio objeto
query después de haber construido su módulo de aplicación. En este caso puede pasárselo a query() así:
Using perl Syntax Highlighting
$webapp->query($new_query_object);
my $q = $webapp->query(); # now uses $new_query_objectColoreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Recientemente, hice una aplicación con CGI::Application. En situaciones normales, solo necesitas llamar a query() para obtener acceso al objeto CGI.pm. Pero... en este caso había una diferencia...
CGI::Application usa el método cgiapp_get_query() para obtener el objeto CGI.pm. El problema es que la forma de obtenerlo es muy básica:
Using perl Syntax Highlighting
sub cgiapp_get_query {
my $self = shift;
# Include CGI.pm and related modules
require CGI;
# Get the query object
my $q = CGI->new();
return $q;
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Como ves, lo único que hace es cargar el módulo CGI y crear un objeto con él. Y con él podemos llamar a las funciones típicas del módulo CGI, incluidas las de generación de código HTML.
El problema es que yo necesitaba que ese objeto CGI tuviera, además, puesta la opción -newstyle_urls. En un programa cgi normal, hubiera puesto:
use CGI qw(:html2 :html3 :html4 :form -newstyle_urls);
pero, como ves en el código anterior, eso no es lo que ocurre. Así que no queda más remedio que darle a CGI::Application nuestro propio objeto CGI.
Hay varias formas de hacerlo:
1.- sobreescribiendo el método cgiapp_get_query()
2.- crear un objeto CGI y pasárselo a CGI::Application.
3.- (no comentado en el manual). Haces un 'use CGI (resto de opciones)' dentro del package de tu aplicación, antes del 'use base "CGI::Application";'. Esto, tiene el efecto de cargar el módulo CGI en memoria, pero con nuestras opciones. Cuando CGI::Application lo requiera, al crearse el objeto de nuestra aplicación (que será del tipo CGI::Application), llamará al método query(), y como el módulo CGI ya estará cargado, la línea 'require CGI' no tendrá efecto, por lo que, luego, con la línea 'my $q = CGI->new();' se estará creando un objeto CGI pero con nuestras opciones.
4.- (seguro que hay alguna más)
La verdad es que es un poco enrevesado, y casi es mejor usar alguna de las dos primeras opciones.
Pero... repito: en la mayor parte de las ocasiones, no vas a necesitar crear un objeto CGI, sino que, simplemente, solo tendrás que llamar al método query() para tener acceso a ese objeto.
- si vas a usar sesiones, es mejor usar el complemento CGI::Application::Plugin::Session. Este módulo carga CGI::Session por ti. Lo único que tienes que hacer es:
1.- en cgiapp_init() (por ejemplo), indicas las opciones en las que van a trabajar las sesiones, es decir, si son en ficheros de texto, o en base de datos. Yo, por ejemplo, para guardar las sesiones en disco:
Using perl Syntax Highlighting
$self->session_config(
CGI_SESSION_OPTIONS
=> [ 'driver:File', $query, {Directory
=> "$DIRECTORIO_WEB/sesiones"} ],
DEFAULT_EXPIRY
=> '+90d',
COOKIE_PARAMS
=> { -expires
=> '+90d' },
SEND_COOKIE
=> 1
,
);Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
session_config() es un método de CGI::Application::Plugin::Session, donde indicamos las opciones que queremos que tengan las sesiones. En este ejemplo, uso el 'driver:File', para guardar las sesiones en disco.
2.- a partir de ese momento, dentro del programa solo necesito referirme al método session() para acceder al objeto CGI::Session creado por este complemento.
Para controlar el tema de sesiones caducadas, puede ser por el tiempo de expiración, o porque el usuario ha decidido hacer un
logout.
En caso de
logout, te vale con hacer algo como esto (en el
RunMode del
logout, por ejemplo):
Using perl Syntax Highlighting
$self->session_recreate; # creamos una nueva CGI::Session
$session = $self->session; # la obtenemos
$session->param(email
=> '', usuario
=> ''); # y asignamos unos valores vacíosColoreado en 0.001 segundos, usando
GeSHi 1.0.8.4
De esta manera, rompes el vínculo con la sesión que mantenía el usuario. Al hacer el session_recreate(), CGI::Application transmite una nueva
cookie, que ya no tiene nada que ver con la anterior. Y como pones algunos parámetros con valores vacíos, tu programa, en la siguiente ocasión que es ejecutado, sabe que es una sesión nueva (o un nuevo usuario).
En el caso de expiración por tiempo, no hay que hacer nada:
* el navegador web del usuario, dejará de enviar las galletas (
cookies) caducadas
* si recibimos una cookie para una sesión que ha caducado (mirar el atributo DEFAULT_EXPIRY de más arriba), tampoco importa porque CGI::Application::Plugin::Session creará una sesión nueva en la primera ocasión en la que llamemos al método session().
Lo más sencillo para controlar el acceso del usuario: ver si un determinado parámetro existe en la sesión actual. Si, por ejemplo, no existe O está vacío el parámetro 'registrado' (sacado de
$self->session->param('registrado')) entonces sabemos que el usuario no se ha identificado, por lo que le sacaremos en la página un contenido distinto que si sí lo estuviera.