Работа с сессиями в Perl
Date May 24th, 2010 Author Vitaly Agapov
Механизм сессий позволяет производить аутентификацию пользователей и сохранять некоторые данные между сеансами работы каждого пользователя в Web. Этот метод обладает рядом преимуществ перед вариантом с хранением всей пользовательской информации в cookies, потому как при этом все данные хранятся на сервере, а от пользователя необходимо получать только индентификатор сессии.
В Perl работу с сессиями обеспечивает модуль CGI::Session. Он позволяет сохранять данные о сессиях в файлах или в базе данных. Подерживаются в том числе такие вещи, как DB2 или SQLite. Нас же интересует в основном MySQL (CGI::Session::Driver::mysql).
Рассмотрим на примере условного cgi-скрипта, как все это делается.
#!/usr/bin/perl use CGI qw(:standard); # Подключаем модуль с опцией привязки сессии к IP-адресу use CGI::Session ( "-ip_match" ); use CGI::Session::Driver::mysql; use DBI; # Создаём дескриптор подключения к MySQL my $dbh = DBI->connect("DBI:mysql:database=dbname;host=localhost","username","pwd",{"RaiseError" => 1}); my $cgi = new CGI; # Если через форму передано значение login (то есть пользователь пытается авторизоваться) if ($cgi->param("login")) { # Проверяем логин и пароль. Здесь check_user - это условная процедура, возвращающая # идентификатор пользователя при успешной аутентификации my $check_result=&check_user; if ($check_result =~ /^\d+$/) { # Условие успешной аутентификации # Инициализация объекта $session = CGI::Session->new("driver:mysql", undef, { Handle => $dbh } ); # Сохраняем данные сессии. В нашем случае - логин и ID пользователя $session->param(username => $cgi->param("login"), userid => $check_result); # Добавляем заголовок с cookies print $session->header(-location=>"/"); # Устанавливаем "протухание" неактивной сессии через два часа $session->expire("+2h"); # Сбрасываем данные на драйвер. В нашем случае - в MySQL. $session->flush(); } else { # Доступ запрещён print $cgi->header(-type=>"text/html",-location=>"login.pl"); } } else { # Загружаем параметры сессии из базы данных $session = CGI::Session->load("driver:mysql", undef, { Handle => $dbh } ) or die CGI::Session->errstr; if ($session) { # Если сессия существуем $input{"session_login"} = $session->param("username"); $input{"session_userid"} = $session->param("userid"); } else { $input{"session_login"} = "Anonymous"; $input{"session_userid"} = 0; } } # Если через форму передано значение logout (то есть пользователь пытается выйти) if ($cgi->param("logout")) { # Удаляем сессию $session->delete(); print $session->header(-location=>"info"); # Удаляем сессию из базы данных $session->flush(); } print header, start_html, h1("Hello, $user_name!"), print <<HTML <form method="post"> Username: <input type="text" name="usr"> Password: <input type="password" name="pwd"> <input type="submit"> </form> HTML end_html;
Для работы модуля в базе данных должна быть таблица sessions:
mysql> desc sessions;
+-----------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+----------+------+-----+---------+-------+
| id | char(32) | NO | PRI | NULL | |
| a_session | text | NO | | NULL | |
+-----------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
Tags: MySQL, Perl
Category:
MySQL, Perl, Web-dev |
6 Comments »
8 June 2010 - 7:56
Спасибо, информация оказалась полезной. зы Сайт мне очень понравился :)
29 August 2012 - 16:47
А как сделать тоже самое только данные сеси из базы получать не по айпи, а по айди сесии из кукисов ?
29 August 2012 - 16:48
А как сделать тоже самое только данные сессии из базы получать не по айпи, а по айди сесии из кукисов ?.
30 August 2012 - 8:11
Вообще-то именно так здесь всё и происходит. IP-адрес пользователя никоим образом не участвует в поддержании сессии. Участвует только индентификатор сессии, который генерится модулем CGI::Session
30 August 2012 - 9:55
Виталий тогда непонятно где в коде айди сессии в куки передается …
20 June 2014 - 9:09
driver booster
agapoff.name | IT блог » Blog Archive » РабоÑа Ñ ÑеÑÑиÑми в Perl