AxKit-XSP-Session
view release on metacpan or search on metacpan
lib/Apache/AxKit/Plugins/Session.pm view on Meta::CPAN
package Apache::AxKit::Plugins::Session;
use Apache::Session::Flex;
use Apache::Request;
use constant DEBUG => 0;
use lib qw( $VERSION %session );
$VERSION = 0.11;
sub handler
{
my $r = Apache::Request->instance(shift);
# Session handling code
%session = ();
my $no_cookie = 0;
my $opts = {};
# Load the configuration parameters
my $cfgDataStore = $r->dir_config( 'SessionDataStore' );
my $cfgLock = $r->dir_config( 'SessionLock' );
my $cfgGenerate = $r->dir_config( 'SessionGenerate' );
my $cfgSerialize = $r->dir_config( 'SessionSerialize' );
my %flex_options =
(
Store => $cfgDataStore || 'DB_File',
Lock => $cfgLock || 'Null',
Generate => $cfgGenerate || 'MD5',
Serialize => $cfgSerialize || 'Storable'
);
# Load session-type specific parameters
foreach my $arg ( split( /\s*,\s*/, $r->dir_config( 'SessionArgs' ) ) )
{
my ($key, $value) = split( /\s*=>\s*/, $arg );
$flex_options{$key} = $value;
}
# Read in the cookie if this is an old session
my $cookie = $r->header_in('Cookie');
{
# eliminate logging of Apache::Session warn messages
local $^W = 0;
$cookie =~ s/SESSION_ID=(\w*)/$1/;
if ( $cookie ) {
print STDERR "Loading existing session: \"$cookie\"\n" if DEBUG;
my $res = tieHash( $cookie, \%flex_options );
print STDERR "The tie returned $res\n" if DEBUG and $res;
}
unless ( $session{_session_id} )
{
print STDERR "Creating a new session, since \"$session{_session_id}\" didn't work.\n" if DEBUG;
my $res = tieHash( undef, \%flex_options );
$no_cookie = 1;
}
}
# Might be a new session, so lets give them a cookie
if (!defined($cookie) || $no_cookie)
{
my $session_cookie = "SESSION_ID=$session{_session_id}";
$r->header_out("Set-Cookie" => $session_cookie);
$session{_creation_time} = time;
print STDERR "Set a new header for the session cookie: \"$session_cookie\"\n" if DEBUG;
}
# Update the "Last Accessed" timestamp key
$session{_last_accessed_time} = time;
# This is to try using the pnotes table, passing as a ref
$r->pnotes( xsp_session => \%session );
$r->pnotes( xsp_session_ref => tied %session );
print STDERR "Successfully set the session object in the pnotes table\n" if DEBUG;
return OK;
}
sub tieHash
{
my ( $id, $options ) = @_;
eval
{
tie %session, 'Apache::Session::Flex', $id, $options;
};
return $@ if ( $@ );
}
1;
__END__
=head1 NAME
Apache::AxKit::Plugins::Session - AxKit plugin that handles setting / loading of Sessions
=head1 SYNOPSIS
AxAddPlugin Apache::AxKit::Plugins::Session
PerlSetVar SessionDataStore DB_File
PerlSetVar SessionArgs FileName,/tmp/sessions
=head1 DESCRIPTION
Session is an AxKit plugin which automatically creates and manages
server-side user sessions. Based on Apache::Session::Flex, this allows
you to specify all the parameters normally configurable through ::Flex.
=head1 Parameter Reference
=head2 C<SessionDataStore>
Sets the backend datastore module. Default: DB_File
=head2 C<SessionLock>
Sets the record locking module. Default: Null
=head2 C<SessionGenerate>
Sets the session id generation module. Default: MD5
=head2 C<SessionSerialize>
( run in 0.476 second using v1.01-cache-2.11-cpan-39bf76dae61 )