CGI::Application поразил меня в очередной раз. Реализация работы с сессиями через CGI::Application::Plugin::Session потрясающе удобна и порождает элегантный код.
Описание задачи
Была поставлена задача создать пример использования CGI::Application::Plugin::Session. Пример «чистой» сессии, без авторизаций, аутентификаций и пр.
Примеры кода
Скрипт cgi
|
1 2 3 4 5 6 7 8 9 |
#!/usr/bin/perl use strict; use warnings; use App3; # для тестирования работы с сессиями App3->new->run; |
Модуль pm
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
package App3; use strict; use warnings; use base 'CGI::Application'; use CGI::Application::Plugin::TT; use CGI::Session::Driver::file; use CGI::Application::Plugin::Session; sub setup { my $self = shift; $self->mode_param('step'); $self->start_mode('on_start'); $self->run_modes( on_start => \&on_start, on_save_addr => \&on_save_addr, on_close_session => \&on_close_session, AUTOLOAD => sub { return 'Запрошенной страницы не существует' } ); } sub cgiapp_init { my $self = shift; # Configure the session $self->session_config( CGI_SESSION_OPTIONS => [ "driver:File", $self->query, {Directory=>'/dev-lab/tmp'} ], DEFAULT_EXPIRY => '+1w', COOKIE_PARAMS => { -expires => '+24h', -path => '/', }, SEND_COOKIE => 1, ); } sub on_start { my $self = shift; my $q = $self->query(); my $tt_params = {}; $tt_params->{addr} = $self->session->param('addr'); $tt_params->{block} = 'show_index_page'; return $self->tt_process('template3.tt', $tt_params); } sub on_save_addr { my $self = shift; my $tt_params = {}; my $q = $self->query(); $self->session->param('addr', $q->param('addr')); return $self->on_start; } sub on_close_session { my $self = shift; my $tt_params = {}; $self->session_delete; $tt_params->{block} = 'show_close_session_page'; return $self->tt_process('template3.tt', $tt_params); } |
Шаблон tt
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> <title>session</title> </head> <body> <h1>Session</h1> [%- TRY -%] [%-INCLUDE $block-%] [%- CATCH -%] Ошибочка вышла [%- END -%] </body> </html> [%-#-----------------------------------------%] [%-BLOCK show_index_page-%] [%-#-----------------------------------------%] [%-IF addr-%] <p>[%-addr-%]</p> <form action="app3.cgi" method="POST"> <input type="hidden" name="step" value="on_close_session"> <input value="Завершить сессию" type="submit"> </form> [%-ELSE-%] <p>Укажите почтовый адрес:</p> <form action="app3.cgi" method="POST"> <input type="hidden" name="step" value="on_save_addr"> <textarea name="addr" cols="40" rows="3"></textarea><br> <input value="Сохранить адрес" type="submit"> </form> [%-END-%] [%-#-----------------------------------------%] [%-END-%] [%-#-----------------------------------------%] [%-BLOCK show_close_session_page-%] [%-#-----------------------------------------%] <p>Ваша сессия завершена. До свидания!</p> [%-#-----------------------------------------%] [%-END-%] |
Результаты работы
После обращения клиента создается простая сессия. Клиент может указать какие-то данные (в данном случае, это его адрес, а могли бы быть персональные данные, или содержимое корзины товаров), которые будут привязаны к сессии и сохраняться до ее окончания.
Если клиент указал свои данные, они будут отображаться ему при каждом посещении страницы, пока он
- не завершит сессию принудительно,
- срок действия сессии не иссякнет автоматически.
Данные сессии хранятся в текстовом файле.
Файл сессии
По адресу /dev-lab/tmp автоматически создается файл сессии.
Например, cgisess_cd6170af135c6668eb0e007d12d3e923:
|
1 2 3 4 5 6 7 8 9 |
$D = { '_SESSION_ETIME' => 604800, '_SESSION_ID' => 'cd6170af135c6668eb0e007d12d3e923', '_SESSION_ATIME' => 1290085972, 'addr' => 'Moscow, Krasnopresnenskaya nabereznaya, 8 korp.10', '_SESSION_REMOTE_ADDR' => '127.0.0.1', '_SESSION_EXPIRE_LIST' => {}, '_SESSION_CTIME' => 1290001182 };;$D |
Каждой сессии соответствует свой собственный файл.
Cookies
Браузер сохраняет для себя cookies, с номером сессии, датой ее окончания и т.п.
