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();
44 sub fetch_or_create_session {
46 $self->session_class->fetch_or_create($req, $self);
53 my $session = $self->fetch_or_create_session(Plack::Request->new($env));
55 $env->{'psgix.session'} = $env->{'plack.session'} = $session;
57 my $res = $self->app->($env);
58 $self->response_cb($res, sub {
59 my $res = Plack::Response->new(@{$_[0]});
60 $env->{'psgix.session'}->finalize($res);
61 $res = $res->finalize;
62 $_[0]->[0] = $res->[0];
63 $_[0]->[1] = $res->[1];
75 Plack::Middleware::Session - Middleware for session management
85 [ 'Content-Type' => 'text/plain' ],
86 [ 'Hello, your Session ID is ' . $env->{'psgix.session'}->id ]
95 # Or, use the File store backend (great if you use multiprocess server)
96 # For more options, see perldoc Plack::Session::Store::File
98 enable 'Session', store => 'File';
104 This is a Plack Middleware component for session management. By
105 default it will use cookies to keep session state and store data in
106 memory. This distribution also comes with other state and store
107 solutions. See perldoc for these backends how to use them.
109 It should be noted that we store the current session in the
110 C<psgix.session> key inside the C<$env> where you can access it
111 as needed. Additionally, as of version 0.09, you can call the
112 C<session> method of a L<Plack::Request> instance to fetch
113 whatever is stored in C<psgix.session>.
115 B<NOTE:> As of version 0.02 the session is stored in C<psgix.session>
116 instead of C<plack.session>. We still keep a copy of it in
117 C<plack.session>, but this is deprecated and will be removed
124 =item L<Plack::Session::State>
126 This will maintain session state by passing the session through
127 the request params. It does not do this automatically though,
128 you are responsible for passing the session param.
130 =item L<Plack::Session::State::Cookie>
132 This will maintain session state using browser cookies.
140 =item L<Plack::Session::Store>
142 This is your basic in-memory session data store. It is volatile storage
143 and not recommended for multiprocessing environments. However it is
144 very useful for development and testing.
146 =item L<Plack::Session::Store::File>
148 This will persist session data in a file. By default it uses
149 L<Storable> but it can be configured to have a custom serializer and
152 =item L<Plack::Session::Store::Cache>
154 This will persist session data using the L<Cache> interface.
156 =item L<Plack::Session::Store::Null>
158 Sometimes you don't care about storing session data, in that case
159 you can use this noop module.
165 The following are options that can be passed to this mdoule.
171 This is expected to be an instance of L<Plack::Session::State> or an
172 object that implements the same interface. If no option is provided
173 the default L<Plack::Session::State::Cookie> will be used.
177 This is expected to be an instance of L<Plack::Session::Store> or an
178 object that implements the same interface. If no option is provided
179 the default L<Plack::Session::Store> will be used.
181 It should be noted that this default is an in-memory volatile store
182 is only suitable for development (or single process servers). For a
183 more robust solution see L<Plack::Session::Store::File> or
184 L<Plack::Session::Store::Cache>.
186 =item I<session_class>
188 This can be used to override the actual session class. It currently
189 defaults to L<Plack::Session> but you can substitute any class which
190 implements the same interface.
196 All complex software has bugs lurking in it, and this module is no
197 exception. If you find a bug please either email me, or add the bug
204 Stevan Little E<lt>stevan.little@iinteractive.comE<gt>
206 =head1 COPYRIGHT AND LICENSE
208 Copyright 2009, 2010 Infinity Interactive, Inc.
210 L<http://www.iinteractive.com>
212 This library is free software; you can redistribute it and/or modify
213 it under the same terms as Perl itself.