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

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

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

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

config.action_controller.session = { :key => 'whatever', :secret => 'nottellingyou', :expire_after => 30.minutes } 

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

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

 session :session_expires => 1.day.from_now 

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

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

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

Rails wiki上的会话选项页面暗示这只能通过插件实现:


设置会话cookie过期时间

不幸的是,Rails无法动态设置会话cookie的到期时间。 因此,建议您使用以下插件,它允许您完成它: http : //blog.codahale.com/2006/04/08/dynamic-session-expiration-times-with-rails/


当然考虑到插件是旧的,可​​能无法使用当前版本的Rails(我没有看过具体细节)

经过Rails 3.x中的大量痛苦和实验后,您需要在每个请求的后filter中设置自定义会话参数

  class ApplicationController < ActionController::Base after_filter :short_session ... def short_session request.session_options = request.session_options.dup request.session_options[:expire_after] = 1.minute request.session_options.freeze end 

使用它,它在rails 2.1.x中为我工作:

SlidingSessions

我目前已将Cookie设置为在用户登录后2周到期,并将其设置为30分钟很简单。

您可以尝试将以下行添加到environment.rb文件中:

 session :session_key => 'my_session_key' session :session_expires => 1.day.from_now 

或者,您可以按如下方式设置会话选项:

 ActionController::Base.session_options[:session_expires] = 1.day.from_now 

我没有彻底测试过,所以YMMV。