Исправлены два бага в плагине Session

15.01.2013

В сессионном плагине найдены два довольно старых и неприятных бага.

Первый возникал при первом входе пользователя и первичном обращении к get_session и выражался в создании лишней записи в таблице сессий (или лишних ключей в Memcached). Для удаления его в проектах, использующих сессии достаточно просто накатить новую версию из репозитория (make plup) и перегрузить проект.

Второй баг более комплексный и возникает в следующем случае: пользователь заходит на сайт, бэкенд запрашивает для него сессию, получает ее и на этом же запросе пишет что-то в сессию (вызов $keeper->{session}->store_value). В этом случае сессионная кука пользователю выставлена, но еще не может быть прочитана. Процедура store_value пытается снова получить session_id, не получает ничего и проводит заново процедуру получения сессии. В итоге выставляется еще одна кука, старая сессия отправляется в ад (вместе с сопутствующими строками в таблице сессий) и возникает новая сессия с одним заполненным значением. Повторный вызов store_value в пределах этого же запроса приводит к возникновению еще одной сессии с одним значением и так далее.

Если в вашем приложении есть подобное место, необходимо не только обновить плагин из репозитория, но и поправить вызовы процедуры сохранения, добавив в него параметр _session_id, заполненный идентификатором свежесозданной сессии:

# Получение сессии, сохранение ее в глобальной переменной
$session = $keeper->{session}->get_session;

# Сохранение параметров и передача id сессии
$keeper->{session}->store_value(
        _session_id => $session->{_session_id},
       param1 => 'param1', param2 => 'param2'
);

В ближайшее время плагин будет модифицирован следующим образом: $keeper->{session}->get_session будет возвращать не HASH, а объект session::Session, который уже будет нагружен методами store_value, delete_key, logon, logoff и так далее. Объект будет навеском над имеющимся зоопарком процедур, так что весь уже написанный код можно будет не переписывать заново. Однако, в дальнейшем мы рекомендуем использовать только объектные методы. Так сказать, во избежание.

Кроме того, добавлена возможность передавать в плагин из приложения значение домена, на который выставляется кука. Это сделано для реализации муравейников - приложений, обслуживающих несколько независимых проектов, живущих в разных доменах. Примером такого приложения является Promosite, который будет добавлен в репозиторий в раздел примеров.

Новости

26.04.2017: Теперь и под CentOS
16.06.2015: Установка под Linux (на примере Ubuntu)
8.06.2015: Update конфигов до Perl версии 5.16.xx
3.12.2014: Замена библиотеки Cache::Memcached на Cache::Memcached::Fast
23.10.2014: Срочный апдейт портов
6.02.2013: Модификация плагина Session
15.01.2013: Исправлены два бага в плагине Session

Новости

26.04.2017: Теперь и под CentOS
16.06.2015: Установка под Linux (на примере Ubuntu)
8.06.2015: Update конфигов до Perl версии 5.16.xx
3.12.2014: Замена библиотеки Cache::Memcached на Cache::Memcached::Fast
23.10.2014: Срочный апдейт портов
6.02.2013: Модификация плагина Session
15.01.2013: Исправлены два бага в плагине Session