我目前正在为我的Rails应用程序使用基于ActiveRecord的会话存储,我有一个后台进程,每30分钟清除一次非活动会话。
我想切换到Rails新的基于cookie的会话存储,但是如何将会话的到期时间设置为30分钟,而不是默认的“会话结束时”值?
答案 0 :(得分:14)
我在办公室里谈话后偶然发现了这个问题。仅仅为了完整起见,我发现可以在一段时间不活动后使会话过期,并且它已内置到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会议以来,它似乎已经存在。
答案 1 :(得分:5)
理想情况下,您需要将类似的内容添加到environment.rb:
session :session_expires => 1.day.from_now
但这不起作用,因为代码只在APP启动时运行一次,因此第二天所有会话都是在过期时创建的。
我通常将session_expires
设置为将来某个时间(6个月)。然后在我的应用程序控制器上手动设置并检查session[:expires]
中的before_filter
日期,并在该日期过后重置会话。
这样可以非常轻松地在登录时添加“让我登录___”选项,您只需设置session[:expires] = Time.now + ___
答案 2 :(得分:2)
Rails wiki上的session options页面暗示这只能通过插件实现:
不幸的是,Rails没有办法动态设置会话cookie的到期时间。因此,建议您使用以下插件,它允许您完成它:http://blog.codahale.com/2006/04/08/dynamic-session-expiration-times-with-rails/
当然考虑到插件已经过时了,可能无法使用当前版本的Rails(我没有看过具体细节)
答案 3 :(得分:2)
经历了很多痛苦之后试验,在Rails 3.x中找到,您需要在每个请求的后过滤器中设置自定义会话参数
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
答案 4 :(得分:0)
答案 5 :(得分:-1)
您可以尝试将以下行添加到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。