Установить программный выпуск cookie сеанса стойки
Я использую Rack, чтобы попытаться реализовать функцию "Запомнить меня" в моем приложении Sinatra.
Я могу установить, что cookie сеанса истекает, когда сеанс заканчивается или через X секунд, но я хотел бы сделать оба.
Например, если пользователь нажал "запомнить меня", я хочу, чтобы их сеанс завершился через X секунд. Например, у моего app.rb есть строка, которая выглядит так:
use Rack::Session::Cookie, :expire_after => 2592000, #30 days in seconds
:secret => MY_SECRET
Я пытаюсь сделать следующее, когда пользователь входит в систему:
if (!remember_me)
env['rack.session.options'][:expire_after] = nil
end
Однако это не устанавливает значение cookie.
Кто-нибудь знает, как установить это?
Спасибо заранее.
Ответы
Ответ 1
Я пытался сделать то же самое, и я понял, в чем проблема для меня. Файл cookie сеанса устанавливается по каждому запросу, если у вас установленное значение expire_after. Поэтому, когда вы говорите, что (! Remember_me), для этого запроса время истечения срока действия cookie устанавливается равным нулю. Однако в самом следующем запросе cookie сеанса повторно инициализируется с истечением 2592000. Похоже, что исправление не устанавливает время истечения по умолчанию expire_after и вместо этого скажет:
# don't set default expire time
use Rack::Session::Cookie, :secret => MY_SECRET
if(remember_me)
env['rack.session.options'][:expire_after] = 2592000
end
Я, к сожалению, не понял, как установить значение по умолчанию expire_after и постоянно продлить это время программно.
Ответ 2
Это, вероятно, нужно сделать до загрузки сеанса.
См. Rack:: Session:: Cookie # load_session и Rack:: Session:: Cookie # commit_session
Ответ 3
Ответ Криса на самом деле не сработал у меня. Я обнаружил, что должен был убедиться, что я включил исходные параметры сеанса с новым значением "expire_after", поэтому вместо:
env['rack.session.options'][:expire_after] = 2592000
Я бы использовал:
env['rack.session.options'].merge! expire_after: 2592000
и обязательно поставьте оператор use Rack::Session::Cookie
(без установки expire_after
) в блок configure
, если вы используете Sinatra.
Это сделало трюк.