Подтвердить что ты не робот

Установить программный выпуск 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.

Кто-нибудь знает, как установить это?

Спасибо заранее.

4b9b3361

Ответ 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.

Это сделало трюк.