2013-04-08 36 views
2

,當你建立會話引擎可以設置會話終結的末日應用[到期]:如何設置會話:在機架會議(西納特拉)

use Rack::Session::Cookie, :expire_after => 60*60*3, :secret => 'xxxx' 

但我想啓用更長的會話對於某些用戶。說兩個星期。

session[:expires] = ?? #how and where do I put this.? 

我是否需要在每次通話時設置(在做之前?)還是一次足夠好? session [:expires]是否正確設置?

回答

0

我試圖通過在西納特拉的after過濾器要做到這一點,但它沒有工作,我想這將after過濾器已運行後的會議,所以我敲了一個快速機架過濾器,它似乎工作。

require 'sinatra' 

class SessionExpiryModifier 
    def initialize(app,options={}) 
    @app,@options = app,options 
    end 
    def call(env) 
    warn env["rack.session.options"].inspect 
    t = Time.now.to_i.even? ? 10 : 60 
    env["rack.session.options"].merge! :expire_after => 60 * 60 * t 
    @app.call env 
    end 
end 

configure do 
    use Rack::Session::Cookie, 
    :expire_after => 60*60*3, 
    :secret => 'xxxx' * 10 
    use SessionExpiryModifier 
end 

get "/" do 
    session[:usr] = Time.now 
    env["rack.session.options"].inspect 
end 

然而,這使得它有很多很難得到來自西納特拉應用條件到機架過濾器上採取哪個分支決定,而是取決於你的條件是什麼。也許可以在過濾器可以讀取的頭文件中插入一些內容以做出決定。

希望有所幫助。

1

首先請確保您沒有設置expire_after值與use Rack::Session::Cookie命令,然後將use Rack::Session::Cookie放在您的configure塊中。接下來創建一個「到期時間」變量(假設爲expiry_time)或在config中設置。現在對於每個用戶,當他們登錄,檢索其expiry_time設置,併發出以下命令:

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

這應該做你的要求。

如果這不適用於您,請嘗試將env...merge!命令放在before塊中。