1 package Plack::Middleware::Session;
6 our $AUTHORITY = 'cpan:STEVAN';
14 use parent 'Plack::Middleware';
16 use Plack::Util::Accessor qw(
25 $self->session_class( 'Plack::Session' ) unless $self->session_class;
26 $self->state( 'Cookie' ) unless $self->state;
28 $self->state( $self->inflate_backend('Plack::Session::State', $self->state) );
29 $self->store( $self->inflate_backend('Plack::Session::Store', $self->store) );
33 my($self, $prefix, $backend) = @_;
35 return $backend if defined $backend && Scalar::Util::blessed $backend;
38 push @class, $backend if defined $backend; # undef means the root class
41 Plack::Util::load_class(@class)->new();
48 my $session = $self->session_class->fetch_or_create( Plack::Request->new($env), $self );
50 $env->{'psgix.session'} = $env->{'plack.session'} = $session;
52 my $res = $self->app->($env);
53 $self->response_cb($res, sub {
54 my $res = Plack::Response->new(@{$_[0]});
55 $env->{'psgix.session'}->finalize( $res );
56 $res = $res->finalize;
57 $_[0]->[0] = $res->[0];
58 $_[0]->[1] = $res->[1];
70 Plack::Middleware::Session - Middleware for session management
80 [ 'Content-Type' => 'text/plain' ],
81 [ 'Hello, your Session ID is ' . $env->{'psgix.session'}->id ]
90 # Or, use the File store backend (great if you use multiprocess server)
91 # For more options, see perldoc Plack::Session::Store::File
93 enable 'Session', store => 'File';
99 This is a Plack Middleware component for session management. By
100 default it will use cookies to keep session state and store data in
101 memory. This distribution also comes with other state and store
102 solutions. See perldoc for these backends how to use them.
104 It should be noted that we store the current session in the
105 C<psgix.session> key inside the C<$env> where you can access it
106 as needed. Additionally, as of version 0.09, you can call the
107 C<session> method of a L<Plack::Request> instance to fetch
108 whatever is stored in C<psgix.session>.
110 B<NOTE:> As of version 0.02 the session is stored in C<psgix.session>
111 instead of C<plack.session>. We still keep a copy of it in
112 C<plack.session>, but this is deprecated and will be removed
119 =item L<Plack::Session::State>
121 This will maintain session state by passing the session through
122 the request params. It does not do this automatically though,
123 you are responsible for passing the session param.
125 =item L<Plack::Session::State::Cookie>
127 This will maintain session state using browser cookies.
135 =item L<Plack::Session::Store>
137 This is your basic in-memory session data store. It is volatile storage
138 and not recommended for multiprocessing environments. However it is
139 very useful for development and testing.
141 =item L<Plack::Session::Store::File>
143 This will persist session data in a file. By default it uses
144 L<Storable> but it can be configured to have a custom serializer and
147 =item L<Plack::Session::Store::Cache>
149 This will persist session data using the L<Cache> interface.
151 =item L<Plack::Session::Store::Null>
153 Sometimes you don't care about storing session data, in that case
154 you can use this noop module.
160 The following are options that can be passed to this mdoule.
166 This is expected to be an instance of L<Plack::Session::State> or an
167 object that implements the same interface. If no option is provided
168 the default L<Plack::Session::State::Cookie> will be used.
172 This is expected to be an instance of L<Plack::Session::Store> or an
173 object that implements the same interface. If no option is provided
174 the default L<Plack::Session::Store> will be used.
176 It should be noted that this default is an in-memory volatile store
177 is only suitable for development (or single process servers). For a
178 more robust solution see L<Plack::Session::Store::File> or
179 L<Plack::Session::Store::Cache>.
181 =item I<session_class>
183 This can be used to override the actual session class. It currently
184 defaults to L<Plack::Session> but you can substitute any class which
185 implements the same interface.
191 All complex software has bugs lurking in it, and this module is no
192 exception. If you find a bug please either email me, or add the bug
199 Stevan Little E<lt>stevan.little@iinteractive.comE<gt>
201 =head1 COPYRIGHT AND LICENSE
203 Copyright 2009, 2010 Infinity Interactive, Inc.
205 L<http://www.iinteractive.com>
207 This library is free software; you can redistribute it and/or modify
208 it under the same terms as Perl itself.