您可以在设置会话引擎时为Sinatra应用设置会话到期时间:
use Rack::Session::Cookie, :expire_after => 60*60*3, :secret => 'xxxx'
但我想为某些用户启用更长的会话。说两个星期。
session[:expires] = ?? #how and where do I put this.?
我是否需要设置每次通话(之前?)或曾经足够好?会话[:expires]是正确的设置吗?
答案 0 :(得分: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
块中。
答案 1 :(得分:0)
我尝试通过Sinatra中的after
过滤器执行此操作,但它无效,我猜它会在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过滤器以决定采取哪个分支,但这取决于您的条件。也许在过滤器可以读取的标题中注入一些东西来做出决定。
希望有所帮助。