Работа с сессиями в Perl
Date May 24th, 2010 Author Vitaly Agapov
Механизм сессий позволяет производить аутентификацию пользователей и сохранять некоторые данные между сеансами работы каждого пользователя в Web. Этот метод обладает рядом преимуществ перед вариантом с хранением всей пользовательской информации в cookies, потому как при этом все данные хранятся на сервере, а от пользователя необходимо получать только индентификатор сессии.
В Perl работу с сессиями обеспечивает модуль CGI::Session. Он позволяет сохранять данные о сессиях в файлах или в базе данных. Подерживаются в том числе такие вещи, как DB2 или SQLite. Нас же интересует в основном MySQL (CGI::Session::Driver::mysql).
Рассмотрим на примере условного cgi-скрипта, как все это делается.
01.
#!/usr/bin/perl
02.
use
CGI qw(:standard);
03.
# Подключаем модуль с опцией привязки сессии к IP-адресу
04.
use
CGI::Session (
"-ip_match"
);
05.
use
CGI::Session::Driver::mysql;
06.
use
DBI;
07.
# Создаём дескриптор подключения к MySQL
08.
my
$dbh
= DBI->
connect
(
"DBI:mysql:database=dbname;host=localhost"
,
"username"
,
"pwd"
,{
"RaiseError"
=> 1});
09.
my
$cgi
= new CGI;
10.
# Если через форму передано значение login (то есть пользователь пытается авторизоваться)
11.
if
(
$cgi
->param(
"login"
))
12.
{
13.
# Проверяем логин и пароль. Здесь check_user - это условная процедура, возвращающая
14.
# идентификатор пользователя при успешной аутентификации
15.
my
$check_result
=&check_user;
16.
if
(
$check_result
=~ /^\d+$/) {
# Условие успешной аутентификации
17.
# Инициализация объекта
18.
$session
= CGI::Session->new(
"driver:mysql"
,
undef
, { Handle =>
$dbh
} );
19.
# Сохраняем данные сессии. В нашем случае - логин и ID пользователя
20.
$session
->param(username =>
$cgi
->param(
"login"
), userid =>
$check_result
);
21.
# Добавляем заголовок с cookies
22.
print
$session
->header(-location=>
"/"
);
23.
# Устанавливаем "протухание" неактивной сессии через два часа
24.
$session
->expire(
"+2h"
);
25.
# Сбрасываем данные на драйвер. В нашем случае - в MySQL.
26.
$session
->flush();
27.
}
28.
else
{
29.
# Доступ запрещён
30.
print
$cgi
->header(-type=>
"text/html"
,-location=>
"login.pl"
);
31.
}
32.
}
33.
else
{
34.
# Загружаем параметры сессии из базы данных
35.
$session
= CGI::Session->load(
"driver:mysql"
,
undef
, { Handle =>
$dbh
} ) or
die
CGI::Session->errstr;
36.
if
(
$session
) {
# Если сессия существуем
37.
$input
{
"session_login"
} =
$session
->param(
"username"
);
38.
$input
{
"session_userid"
} =
$session
->param(
"userid"
);
39.
}
40.
else
{
41.
$input
{
"session_login"
} =
"Anonymous"
;
42.
$input
{
"session_userid"
} = 0;
43.
}
44.
}
45.
# Если через форму передано значение logout (то есть пользователь пытается выйти)
46.
if
(
$cgi
->param(
"logout"
)) {
47.
# Удаляем сессию
48.
$session
->
delete
();
49.
print
$session
->header(-location=>
"info"
);
50.
# Удаляем сессию из базы данных
51.
$session
->flush();
52.
}
53.
print
header,
54.
start_html,
55.
h1(
"Hello, $user_name!"
),
56.
print
<<HTML
57.
<form method=
"post"
>
58.
Username: <input type=
"text"
name=
"usr"
>
59.
Password: <input type=
"password"
name=
"pwd"
>
60.
<input type=
"submit"
>
61.
</form>
62.
HTML
63.
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