14

我正在使用 Rack 尝试在我的 Sinatra 应用程序中实现“记住我”功能。

我可以将会话 cookie 设置为在会话结束时或 X 秒后过期,但我想两者都做。

例如,如果用户点击了“记住我”,那么我希望他们的会话在 X 秒后结束。例如,我的 app.rb 有一行如下所示:

use Rack::Session::Cookie, :expire_after => 2592000, #30 days in seconds
                           :secret => MY_SECRET

当用户登录时,我尝试执行以下操作:

if (!remember_me)
  env['rack.session.options'][:expire_after] = nil
end

但是,这不会设置 cookie 值。

这个怎么设置?

4

3 回答 3

4

我试图做同样的事情,但我发现了我的问题所在。如果您设置了 expire_after 时间,则会在每个请求上设置会话 cookie。因此,当您说 if (!remember_me) 时,对于该请求,cookie 的过期时间设置为零。但是,在下一个请求中,会话 cookie 被重新初始化,过期时间为 2592000。似乎解决方法是不设置默认的 expire_after 时间,而是说:

# don't set default expire time
use Rack::Session::Cookie, :secret => MY_SECRET


if(remember_me) 
  env['rack.session.options'][:expire_after] = 2592000 
end

不幸的是,我还没有想出如何设置默认的 expire_after 时间并以编程方式永久延长该时间。

于 2012-06-23T18:01:15.783 回答
0

这可能必须在加载会话之前完成。

请参阅 Rack::Session::Cookie#load_session 和 Rack::Session::Cookie#commit_session

于 2010-06-16T14:03:31.883 回答
0

克里斯的回答实际上对我不起作用。我发现我必须确保将原始会话 'options' 包含在新的 'expire_after' 值中,而不是:

env['rack.session.options'][:expire_after] = 2592000

我会使用:

env['rack.session.options'].merge! expire_after: 2592000

如果您使用 Sinatra,请务必将use Rack::Session::Cookie语句(不带expire_after设置)放入您的块中。configure

这成功了。

于 2013-05-19T23:54:03.970 回答