Механизм сессий предоставляет нам замечательную возможность хранения каких-либо данных между сеансами работы пользователя. Кроме того, на основе сессий возможно организовать идентификацию пользователей.
Хранение данных в сессиях более надёжно как с точки зрения безопасности, так и с точки зрения правильности работы, чем хранение в куках (cookies). Почему? Для работы с сессией от пользователя требуется получить только идентификатор сессии, все данные хранятся на сервере и выбираются по идентификатору. В случае cookies браузер пользователя должен всё «носить с собой» и передавать каждый раз, когда это требуется. К тому же, пользователь может вообще запретить приём кук.
Возможности для работы с сессиями есть во многих распространённых языках - Perl, PHP. По-моему, Java тоже предоставляет такую возможность, но с ней я никогда не общался, так что точно сказать не могу. Мне привычнее Perl, так что опираться я буду на него.
В языке Perl работа с сессиями реализуется с помощью модуля CGI::Session, который можно найти на CPAN Search. Этот модуль предоставляет несколько способов хранения данных: файлы (CGI::Session::File), Berkeley DB (CGI::Session::DB_File) и MySQL (CGI::Session::MySQL). Я буду говорить о случае с хранением в файлах.
Как обычно это происходит в Perl, There's More Than One Way To Do It. Работать с CGI::Session можно двумя способами:
* OO-style;
* связанные хэши.
Рассмотрим оба способа. В первом случае создаётся объект $session:
my $session = new CGI::Session::File($sid, { Directory => "sessions" });
Параметр Directory задаёт каталог на диске, куда будут помещаться файлы с данными сессии; $sid - идентификатор сессии.
Второй способ (связанные хэши) выглядит следующим образом:
tie %session, "CGI::Session::File", $sid, { Directory => "sessions" };
Теперь данные сессии будут доступны в хэше %session в виде пар «ключ/значение».
Идентификатор сессии можно передавать либо через куки, либо как параметр при вызове скрипта.
use CGI qw/:standard/;
use CGI::Session::File;
my $sid = param('sid') || cookie('sid') || undef;
Если значение $sid оказывается неопределённым, то есть идентификатор не был передан, то мы можем сгенерировать его средствами того же CGI::Session:
my $sid = $session->id; # OO-style
my $sid = $session{_session_id}; # tied hash
Помещение данных в сессию и извлечение их делается следующим образом:
# Внесём в сессию новый параметр
$session->param("param_name", $param_value); # OO-style
$session{param_name} = $param_value; # tied hash
# Теперь извлечём его значение my $new_param_value = $session->param("param_name"); # OO-style
my $new_param_value = $session{param_name}; # tied hash
Как видите, всё достаточно просто. Конечно, авторизацию пользователей через сессии я бы делать не стал, но идентификация без проверок паролей, логинов и прочей секурной информации, хранение не требующих принятия особых мер безопасности данных производится вполне нормально.
Вот пример идентификации пользователя:
#!/usr/bin/perl -w
use CGI qw/:standard/;
use CGI::Session::File;
use strict;
my %session;
my $sid = param('SID') || cookie('SID') || undef;
tie %session, "CGI::Session::File", $sid, { Directory => "sess" };
unless (defined $sid) {
$sid = $session{_session_id};
my $user_name = "Anonymous";
} else {
my $user_name = $session{user_name};
}
print header,
start_html,
h1("Hello, $user_name!"),
end_html;
untie %session;
Information
- Posted on 27.04.2013 15:30
- Просмотры: 1192