Perl, CGI :: Session не работает правильно - PullRequest
1 голос
/ 09 декабря 2010

Я пишу веб-приложение, которое должно использовать модуль CGI :: Session ver 4.35. При получении запроса от клиента со строкой SESSIONID

$sid = $cgi->cookie("CGISESSID") || $cgi->param("CGISESSID") || undef;

пытается восстановить сеанс, передавая $ sid в качестве аргумента

$session = new CGI::Session($sid) or ($logger->error(CGI::Session->errstr) and die);

Если был создан сеанс с этим sid, $session->id и $sid равны , то есть должны быть одинаковыми , но на самом деле это НЕ .

Это утверждение, где я создаю совершенно новый сеанс

$session = new CGI::Session("id:md5", undef, {Directory=>$SESSION_DIR}) 
    or ($logger->error(CGI::Session->errstr) and die);

Что здесь пошло не так? Как правильно использовать модуль CGI :: Session?

Ответы [ 3 ]

5 голосов
/ 19 марта 2011

Я поддерживаю CGI :: Session. Я рекомендую создавать сеанс одинаково во всех случаях, например:

$session = CGI::Session->new("id:md5", $cgi, {Directory=>$SESSION_DIR});

Это соответствует рекомендованному синтаксису в документах для new (). Я также рекомендую убедиться, что вы вызываете flush () явно в конце скрипта. Причина этого объясняется более подробно здесь:

http://metacpan.org/pod/CGI::Session#A-Warning-about-Auto-flushing

2 голосов
/ 19 декабря 2012

вам действительно не нужно самостоятельно захватывать cookie-файлы сессии.Если вы передаете экземпляр объекта CGI в CGI :: Session, он делает это за вас.Таким образом, в основном вышеприведенный код с помощью jfd можно переписать так: блоки

my $session = CGI::Session->new( $query );
$self->header_props(-cookie => $session->cookie);

и $query->cookie() и if/else являются избыточными, поскольку они уже существуют в логике CGI :: Session!

Таким образом, приведенный выше код проверяет наличие cookie клиента с именем CGI::Session->name (по умолчанию CGISESSID).Если он не существует, ищет параметр запроса в URL-адресе или в теле запроса с именем CGI::Session->name (по умолчанию также CGISESSID).Если он может получить заявленный идентификатор сеанса, он пытается загрузить свои данные в сеанс.Если идентификатор сеанса не может быть проверен (истек или подделан), он игнорирует его и создает новый пустой сеанс.

Если идентификатор сеанса не может быть найден ни в файле cookie, ни в параметрах URL, он создает новый сеанс.

В большинстве примеров управления сеансами, которые я вижу, попробуйте заново изобрести логику сеанса внутрикод при использовании CGI :: Session.Я просто здесь, чтобы сказать вам, что весь этот код полностью избыточен !!!

Наслаждайтесь использованием CGI :: Session!

0 голосов
/ 09 декабря 2010

Итак, мне не понятно, почему вы создаете сеанс дважды? Вы хотите сначала попытаться получить sid, а затем создать сеанс с ним, независимо от того, существует он или нет. Если он не существует, установите cookie. Это было некоторое время, но я вытащил это из старого куска кода ...

my $sid = $query->cookie('CGISESSID') || undef;
# grab the session obj, if one already exists otherwise create one
my $session = new CGI::Session( "id:md5", $sid, { Directory => $SESSION_DIR } );
# If there is no user cookie, or it's non existent, we give them a new one
if ( !$sid or $sid ne $session->id ) {
    my $cookie = $query->cookie(
        -name    => 'CGISESSID',
        -value   => $session->id,
        -expires => EXPIRE_TIME
    );
    $self->header_props( -cookie => $cookie );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...