如何在Rails中动态设置基于cookie的会话的到期时间

Oll*_*lly 12 ruby-on-rails

我目前正在为我的Rails应用程序使用基于ActiveRecord的会话存储,我有一个后台进程,每30分钟清除一次非活动会话.

我想切换到Rails新的基于cookie的会话存储,但是如何将会话的到期时间设置为30分钟,而不是默认的"会话结束时"值?

Gra*_*son 15

我在办公室里谈话后偶然发现了这个问题.仅仅为了完整起见,我发现可以在一段时间不活动后使会话过期,并且它已内置到Rails中.在config/environment.rb中,执行以下操作:

config.action_controller.session = {
  :key          => 'whatever',
  :secret       => 'nottellingyou',
  :expire_after => 30.minutes
}
Run Code Online (Sandbox Code Playgroud)

检查lib/action_controller/session/cookie_store.rb#114中的(显然未记录的)选项.看起来自从2008年12月转向Rack会议以来它一直存在.

  • 对于Rails 3,语法为:Rails.application.config.session_store:cookie_store,:key =>"whatever",:expire_after => 30.minutes (12认同)

Dan*_*ley 6

理想情况下,您需要向environment.rb添加类似这样的内容:

session :session_expires => 1.day.from_now
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为代码只在APP启动时运行一次,因此第二天所有会话都是在过去的过期时创建的.

我通常session_expires在未来(6个月)设定一段时间.然后手动设置并检查应用程序控制器上的session[:expires]日期,before_filter并在该日期过后重置会话.

这使得在登录时添加"让我登录___"选项非常容易,您只需设置即可 session[:expires] = Time.now + ___