2

您可以在设置会话引擎时为 Sinatra 应用程序设置会话到期时间:

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

但我想为某些用户启用更长的会话。说两周。

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

我是否需要在每次通话之前进行设置(之前?)还是一次就足够了?session[:expires] 设置正确吗?

4

2 回答 2

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块中。

于 2013-05-20T00:01:54.567 回答
0

我试图通过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 过滤器来决定采用哪个分支变得更加困难,但这取决于您的条件。也许将某些内容注入到过滤器可以读取的标题中以做出决定。

希望有帮助。

于 2013-04-10T15:52:23.010 回答