| Mojolicious documentation | Contained in the Mojolicious distribution. |
Mojolicious::Sessions - Signed Cookie Based Sessions
use Mojolicious::Sessions;
Mojolicious::Sessions is a very simple signed cookie based session implementation. All data gets serialized with Mojo::JSON and stored on the client side, but is protected from unwanted changes with a signature.
Mojolicious::Sessions implements the following attributes.
cookie_domaincookie_namecookie_pathdefault_expirationmy $time = $session->default_expiration; $session = $session->default_expiration(3600);
Time for the session to expire in seconds from now, defaults to 3600.
The expiration timeout gets refreshed for every request.
securemy $secure = $session->secure; $session = $session->secure(1);
Set the secure flag on all session cookies, so that browsers send them only over HTTPS connections.
Mojolicious::Sessions inherits all methods from Mojo::Base and implements the following ones.
load$session->load($c);
Load session data from signed cookie.
store$session->store($c);
Store session data in signed cookie.
Mojolicious, Mojolicious::Guides, http://mojolicio.us.
| Mojolicious documentation | Contained in the Mojolicious distribution. |
package Mojolicious::Sessions; use Mojo::Base -base; use Mojo::JSON; use Mojo::Util qw/b64_decode b64_encode/; has 'cookie_domain'; has cookie_name => 'mojolicious'; has cookie_path => '/'; has default_expiration => 3600; has secure => 0; # JSON serializer my $JSON = Mojo::JSON->new; # "Bender, quit destroying the universe!" sub load { my ($self, $c) = @_; # Session cookie return unless my $value = $c->signed_cookie($self->cookie_name); # Deserialize $value =~ s/\-/\=/g; b64_decode $value; return unless my $session = $JSON->decode($value); # Expiration return unless my $expires = delete $session->{expires}; return unless $expires > time; # Content my $stash = $c->stash; return unless $stash->{'mojo.active_session'} = keys %$session; $stash->{'mojo.session'} = $session; # Flash $session->{flash} = delete $session->{new_flash} if $session->{new_flash}; } # "Emotions are dumb and should be hated." sub store { my ($self, $c) = @_; # Session my $stash = $c->stash; return unless my $session = $stash->{'mojo.session'}; return unless keys %$session || $stash->{'mojo.active_session'}; # Flash my $old = delete $session->{flash}; @{$session->{new_flash}}{keys %$old} = values %$old if $stash->{'mojo.static'}; delete $session->{new_flash} unless keys %{$session->{new_flash}}; # Default to expiring session my $expires = 1; my $value = ''; # Actual session data my $default = delete $session->{expires}; if (keys %$session) { # Expiration $expires = $session->{expires} = $default ||= time + $self->default_expiration; # Serialize $value = $JSON->encode($session); b64_encode $value, ''; $value =~ s/\=/\-/g; } # Options my $options = {expires => $expires, path => $self->cookie_path}; my $domain = $self->cookie_domain; $options->{domain} = $domain if $domain; $options->{secure} = 1 if $self->secure; # Session cookie $c->signed_cookie($self->cookie_name, $value, $options); } 1; __END__