如何在机架会话中设置会话[:expires](Sinatra)

时间:2013-04-08 19:55:12

标签: ruby session rack

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

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

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

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

我是否需要设置每次通话(之前?)或曾经足够好?会话[:expires]是正确的设置吗?

2 个答案:

答案 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过滤器以决定采取哪个分支,但这取决于您的条件。也许在过滤器可以读取的标题中注入一些东西来做出决定。

希望有所帮助。