2010-06-16 2 views
12

Я использую Rack, чтобы попытаться реализовать функцию «Запомнить меня» в моем приложении Sinatra.Установить истечение сеанса cookie в стойке программно

Я могу установить, что 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 

Однако это не устанавливает куки стоимость.

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

Заранее спасибо.

ответ

4

Я пытался сделать то же самое, и я понял, что эта проблема для меня. Файл cookie сеанса устанавливается по каждому запросу, если у вас установленное значение expire_after. Поэтому, когда вы говорите, что (! Remember_me), для этого запроса время истечения срока действия 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 

Я, к сожалению, не понял, как иметь время истечения по умолчанию по истечении этого срока и постоянно продлевать это время программно.

0

Возможно, это необходимо сделать до загрузки сессии.

См Rack :: Session :: Cookie # load_session и Rack :: Session :: Cookie # commit_session

0

Ответ Криса на самом деле не помог мне. Я обнаружил, что я должен был убедиться, что я включил в «опции» исходного сеанса с новым значением «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.

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

+0

Не забывайте, что если впоследствии вы установите или удалите что-либо в хэше сеанса, cookie вернется к дате истечения по умолчанию (т. Е. К файлу сеанса). Чтобы это продолжалось с помощью последующих изменений, вам нужно будет сохранить флаг, также отмечающий статус «запомнить меня» в самом хэше сеанса. –