您可以在设置会话引擎时为 Sinatra 应用程序设置会话到期时间:
use Rack::Session::Cookie, :expire_after => 60*60*3, :secret => 'xxxx'
但我想为某些用户启用更长的会话。说两周。
session[:expires] = ?? #how and where do I put this.?
我是否需要在每次通话之前进行设置(之前?)还是一次就足够了?session[:expires] 设置正确吗?
首先确保您没有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块中。
我试图通过afterSinatra 中的过滤器来做到这一点,但它没有用,我猜它会在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 过滤器来决定采用哪个分支变得更加困难,但这取决于您的条件。也许将某些内容注入到过滤器可以读取的标题中以做出决定。
希望有帮助。