Apache2-Controller
view release on metacpan or search on metacpan
lib/Apache2/Controller/Session.pm view on Meta::CPAN
a multi-level hash. If you want to, set the directive flag
C<A2C_Session_Always_Save> and this will set a top-level
timestamp C<< $r->pnotes->{a2c}{session}{a2c_timestamp} >>
on the way out to trigger L<Apache::Session> to save everything.
But if you are potentially accessing the session contents without
setting it every time, you should just set a top-level timestamp
manually to indicate to L<Apache::Session> that you want
things saved at the end of every request, but this may
slow you down on a busy site, so it is not the default.
See L<Apache2::Controller::Directives/A2C_Session_Always_Save>
and L<Apache::Session/BEHAVIOR>.
=head1 IMPLEMENTING TRACKER SUBCLASSES
See L<Apache2::Controller::Session::Cookie> for how to implement
a custom tracker subclass. This implements C<$sid = get_session_id()>
which gets a session id from a cookie, and C<set_session_id($sid)>
which sets the session id in the cookie.
Perhaps some custom tracker subclass would implement
C<get_session_id()> to get the session_id out of the request
query params, and C<set_session_id()> would push a C<PerlOutputFilterHandler>
to post-process all other handler output and append the session id param
onto any url links that refer to our site. That would be cool...
release your own plug-in.
If you wanted to do it with combined cookies and url params in
this way you could
overload C<get_session_id()> and C<set_session_id()>, etc. etc.
=head1 ERRORS
C<<Apache2::Controller::Session>> will throw an error exception if the
session setup encounters an error.
=head1 METHODS
=cut
use strict;
use warnings FATAL => 'all';
use English '-no_match_vars';
use base qw(
Apache2::Controller::NonResponseBase
Apache2::Controller::Methods
);
use YAML::Syck;
use Log::Log4perl qw(:easy);
use File::Spec;
use Digest::SHA qw( sha224_base64 );
use Apache2::Const -compile => qw( OK );
use Apache2::RequestUtil ();
use Apache2::Controller::X;
use Apache2::Controller::Const qw( $DEFAULT_SESSION_SECRET );
=head2 process
The C<process()> method
attaches or creates a session, and pushes a PerlLogHandler
closure to save the session after the end of the request.
It sets the session id cookie
with an expiration that you set in your subclass as C<our $expiration = ...>
in a format that is passed to Apache2::Cookie. (i.e. '3M', '2D', etc.)
Don't set that if you want them to expire at the end of the
browser session.
=cut
my %used; # i feel used!
sub process {
my ($self) = @_;
my $r = $self->{r};
my $session_id = $self->get_session_id();
DEBUG "processing session: ".($session_id ? $session_id : '[new session]');
my $directives = $self->get_directives();
my $class = $directives->{A2C_Session_Class} || 'Apache::Session::File';
DEBUG "using session class $class";
do {
eval "use $class;";
a2cx $EVAL_ERROR if $EVAL_ERROR;
$used{$class} = 1;
} if !exists $used{$class};
my $options = $self->get_options();
DEBUG sub{"Creating session with options:\n".Dump($options)};
my %tied_session = ();
my $tieobj = undef;
($session_id, $tieobj) = $self->tie_session(
\%tied_session,
$class,
$session_id,
$options,
);
# set the session id in the tracker, however that works
$session_id ||= $tied_session{_session_id};
DEBUG "session_id is '$session_id'";
# put the session id value in pnotes
$r->pnotes->{a2c}{session_id} = $session_id;
$self->set_session_id($session_id);
my %session_copy = (%tied_session);
$r->pnotes->{a2c}{session} = \%session_copy;
$r->pnotes->{a2c}{_tied_session} = \%tied_session;
DEBUG "ref of real tied_session is '".\%tied_session."'";
# set state detection handler as the first handler in
# the last phase that connection is open
my @log_handlers = qw(
( run in 0.575 second using v1.01-cache-2.11-cpan-e1769b4cff6 )