Модуль CGI::Session

| Комментариев: 2 | Нет трекбэков

Довольно распространенный модуль для работы с сессиями 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 за дельное замечание. Для тех кто хочет углубится в суть вопроса читайте ветку рассылки.

Нет трекбэков

URL для трекбэков: http://perlmonks.org.ru/cgi-bin/MT/engine/mt-tb.cgi/27

Комментариев: 2

Лучше писать (особенно для других - пусть сразу учатся хорошему стилю)

CGI::Session->new

чем

new CGI::Session

Спасибо! Статья оказалась полезной.

Комментировать

Об этой записи

Сообщение опубликовано 31.08.2009 16:58. Автор — Monks.

Предыдущая запись — Perl - абсолютный лидер!

Следующая запись — Карта Perl-сообщества. Июль 2009

Смотрите новые записи на главной странице или загляните в архив, где есть ссылки на все сообщения.

Страницы


 


 

Page copy protected against web site content infringement by Copyscape