LINUX.ORG.RU

CGI::Session: новая сессия на каждый запрос


0

0

Собсно, проблема в сабже. Делаю, так:

my $sid = $cgi->cookie('DRWSID') || $cgi->param('DRWSID') || undef;
my $session = CGI::Session->new('driver:file', $sid, {Directory=>'/tmp'});
my $cookie = $cgi->cookie(-name=>'DRWSID', -value=> $session->id);
print $cgi->header(-cookie=>$cookie);

Куку оно получает, в конструктор передаёт ($session->{'_CLAIMED_ID'} тот же, что и в куке), но тем не менее, сессия каждый раз создаётся с новым id.

Собсно, почему так, и как это лечится?

★★★

my $q = new CGI;
my $session = new CGI::Session("driver:File", $q, {Directory=>'/tmp'});
my $cookie = $q->cookie(CGISESSID => $session->id );
print $q->header(-cookie=>$cookie,-charset=>'UTF-8');

работает

nikolayd
()
Ответ на: комментарий от friday

Я просто не понял что делает:

my $sid = $cgi->cookie('DRWSID') || $cgi->param('DRWSID') || undef;
.....
my $cookie = $cgi->cookie(-name=>'DRWSID', -value=> $session->id);

в особенности первую строчку - зачем там || - cookie же всегда вернет тебе новый пирожок. Поэтому у тебя и сессия всегда новая, ящитаю.

nikolayd
()
Ответ на: комментарий от nikolayd

> cookie же всегда вернет тебе новый пирожок.

Не всегда. В таком виде оно возвращает существующий. Или undef, если его нет.

friday ★★★
() автор топика

Что самое интересное - выдаёт он новый id, а на диск пишет старый! Т.е. при следующем запросе сессии с новым id просто-напросто не существует.

friday ★★★
() автор топика
Ответ на: комментарий от friday

Проблема наблюдалась только c fcgi/mod_perl. С cgi всё было нормально. Т.е. с fcgi объект сессии уничтожался, и соотв., вызывался flush, только при следующем запросе. Решено принудительным вызовом flush сразу после создания новой сессии.

friday ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.