Rails2.3でsession timeoutを実装


個別に実装する必要があると思ってコードを書いてしまったが
下記でOKみたい。

設定

#config/initializers/session_store.rb

ActionController::Base.session = {
  :expire_after => 1.hour,

もしくは
#config/environment.rb

ActionController::Base.session_options[:expire_after] = 1.hour

railsのソース

この辺り?Rack::Utils.set_cookie_headerに渡している。
#gems/actionpack-2.3.11/lib/action_controller/session/abstract_store.rb

          if (request_cookies.nil? || request_cookies[@key] != sid) || options[:expire_after]
            cookie = {:value => sid}
            Rack::Utils.set_cookie_header!(response[1], @key, cookie.merge(options))
          end

うっかり書いてしまったソース

#app/controllers/application_controller.rb

  SESSION_EXPIRE_SECONDS = 60 * 60
  before_filter :check_session

  def error_session
    render :text => 'session error', :layout => false
  end

  private
  def check_session
    if enable_session?
      update_session
    else
      reset_session
      error_session
    end
  end

  def enable_session?
    return true unless session[:last_at]
    (Time.now - session[:last_at]) <= SESSION_EXPIRE_SECONDS
  end

  def update_session
    session[:last_at] = Time.now
  end