Довольно распространенный модуль для работы с сессиями CGI::Session. В статье я кратко расскажу, как заставить его работать в связке с MySQL.
Итак, в скрипте пишем:
use CGI::Session ( '-ip_match' );
Опция -ip_match привязывает сессию к IP-адресу. То есть сессия будет привязана к IP-адресу пользователя.
Для того чтобы хранить сессии в БД MySQL, а не в файловой системе, необходимо создать сессию примерно следующим образом:
$session = CGI::Session->new('driver:mysql', undef, { Handle => $dbh } );
В данном примере $dbh - стандартный дескриптор подключения к базе данных. В БД должна существовать таблица: sessions, с полями: id CHAR(32) NOT NULL PRIMARY KEY, a_session TEXT NOT NULL
Но если вы укажите только это в своем скрипте, то к удивлению своему не обнаружите в БД записи о сессиях. Для того чтобы все заработало, необходимо еще подключить один модуль:
use CGI::Session::Driver::mysql;
Теперь все заработает!
Работа с сессиями осуществляется довольно просто:
Создать новую сессию можно методом new
$session = CGI::Session->new('driver:mysql', undef, { Handle => $dbh } );
Сохранить данные в сессии (а точнее значение параметра):
$session->param(user => 'name');
После того как вы сохранили данные в сессии вы можете получать эти данные позже:
$username = $session->param('user');
Для загрузки сессии (у пользователя идентификатор сессии хранится в cookie) используйте load:
$session = CGI::Session->load('driver:mysql', undef, { Handle => $dbh } );
Чтобы удалить сессию (к примеру для реализации logout'a) используйте delete:
$session->delete();
Вот собственно и все!
Рабочий пример:
1 #!/usr/bin/perl -w
2
3 # login.pl
4 use strict;
5 use warnings;
6 use CGI;
7 use DBI;
8 use CGI::Session::Driver::mysql;
9 use CGI::Carp qw/fatalsToBrowser warningsToBrowser/;
10 use CGI::Session ( '-ip_match' );
11 my $config=read_config('config.cgi');
12 my $q = CGI->new();
13 my $dbh=mysql_connect($config);
14 my $usr = $q->param('usr');
15 my $pwd = $q->param('pwd');
16 my $session = '';
17
18 if($usr ne '')
19 {
20 if($usr eq "demo" and $pwd eq "demo")
21 {
22 $session = CGI::Session->new('driver:mysql', undef, { Handle => $dbh } );
23 $session->param(username => 'demo');
24 print $session->header(-location=>'index.pl');
25 }
26 else
27 {
28 print $q->header(-type=>"text/html",-location=>"login.pl");
29 }
30 }
31 elsif($q->param('action') eq 'logout')
32 {
33 $session = CGI::Session->load('driver:mysql', undef, { Handle => $dbh } ) or die CGI::Session->errstr;
34 $session->delete();
35 print $session->header(-location=>'login.pl');
36 }
37 else
38 {
39 print $q->header;
40 print <<HTML
41 <form method="post">
42 Username: <input type="text" name="usr">
43
44 Password: <input type="password" name="pwd">
45
46
47 <input type="submit">
48 </form>
49 HTML
50
51 }
52
53
54 sub read_config {
55 my $file=shift || 'config.cfg';
56 my %conf=();
57 open(CFG,"<","$file") || croak "Config error: $!";
58 while(<CFG>) {
59 next if(/^\#/); # сразу пропускаем комментарии
60 chomp;
61 s/^\s+//; # Убрать начальные пропуски
62 s/\s+$//; # Убрать конечные пропуски
63 next unless length; # Что-нибудь осталось?
64 my($key,$value)=split(/\s*=\s*/,$_, 2);
65 $conf{$key}=$value if(defined($key) && defined($value));
66 }
67 return \%conf;
68 }
69
FIX: new CGI::Session на CGI::Session->new . Спасибо: alexchorny за дельное замечание. Для тех кто хочет углубится в суть вопроса читайте ветку рассылки.



Лучше писать (особенно для других - пусть сразу учатся хорошему стилю)
CGI::Session->new
чем
new CGI::Session
Спасибо! Статья оказалась полезной.