2010-06-16 76 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 

然而,這並沒有設置cookie值。

有誰知道如何設置?

在此先感謝。

回答

4

我試圖做同樣的事情,我想通了什麼對我來說,問題是。如果您設置了expire_after時間,會話cookie將在每個請求中設置。所以,當你說if(!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時間,並以編程方式永久延長該時間。

0

這可能必須在會話加載前完成。

見機架::會議::曲奇#load_session和機架::會議::曲奇#commit_session

0

克里斯的答案實際上並沒有爲我工作。我發現,我必須確保我包括原始會話「選項」新'expire_after的價值,所以不是:

env['rack.session.options'][:expire_after] = 2592000 

我會用:

env['rack.session.options'].merge! expire_after: 2592000 

,並確保如果您使用的是Sinatra,則將use Rack::Session::Cookie聲明(不包含expire_after設置)放入您的configure塊中。

這個伎倆。

+0

不要忘記,如果您隨後在會話散列中設置/刪除了任何內容,則Cookie將恢復爲默認的過期日期(即會話cookie)。爲了使其在後續更改中保持不變,您還需要在會話哈希自身內存儲標記「記住我」狀態的標誌。 – 2013-10-07 19:18:47