我试图通过after
Sinatra 中的过滤器来做到这一点,但它没有用,我猜它会在after
过滤器运行后设置会话,所以我敲开了一个快速的 Rack 过滤器,它似乎可以工作。
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
但是,这使得从 Sinatra 应用程序中获取条件到 Rack 过滤器来决定采用哪个分支变得更加困难,但这取决于您的条件。也许将某些内容注入到过滤器可以读取的标题中以做出决定。
希望有帮助。