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

时间:2008-10-30 10:56:06

标签: ruby-on-rails

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

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

6 个答案:

答案 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页面暗示这只能通过插件实现:


设置会话cookie过期时间

不幸的是,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)

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

SlidingSessions

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

答案 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。

相关问题