Как мне динамически установить время истечения срока для сеанса на основе cookie в Rails

В настоящее время я использую хранилище сеансов ActiveRecord для моего приложения Rails, и у меня есть фоновый процесс, который очищает неактивные сеансы каждые 30 минут.

Я хотел бы переключиться на новое хранилище сеансов на основе файлов cookie Rails, но как установить время истечения срока действия сеанса на 30 минут, в отличие от значения по умолчанию "по окончании сеанса"?

Ответ 1

Я наткнулся на этот вопрос после разговора в офисе. Просто для полноты, я обнаружил, что можно истечь сессий после периода бездействия, и он встроен в 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 года.

Ответ 2

В идеале вы хотите добавить что-то вроде этого в environment.rb:

session :session_expires => 1.day.from_now

Но это не сработает, потому что код запускается только один раз при запуске APP и, таким образом, на следующий день все ваши сеансы создаются с истечением в прошлом.

Я обычно устанавливаю session_expires на некоторое время в будущем (6 месяцев). Затем вручную установите и проверьте дату session[:expires] в before_filter на моем контроллере приложений и reset сеанс, когда эта дата прошла.

Это делает ОЧЕНЬ легким добавить параметр "Запомнить меня для ___" при входе в систему, вы просто установите session[:expires] = Time.now + ___

Ответ 3

Страница параметры сеанса в вики Rails подсказывает, что это возможно только через плагин:


Установите время истечения срока действия cookie сеанса

К сожалению, Rails не имеет возможности динамически устанавливать время истечения срока действия cookie сеанса. Поэтому рекомендуется использовать следующий плагин, который позволяет выполнить его: http://blog.codahale.com/2006/04/08/dynamic-session-expiration-times-with-rails/


Конечно, учтите, что плагин устарел и может не работать с вашей текущей версией Rails (я не смотрел специфику)

Ответ 4

После большой боли и экспериментов, найденных в 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

Ответ 5

Используйте это, он работает для меня в rails 2.1.x:

SlidingSessions

В настоящее время у меня есть файлы cookie, срок действия которых истекает ровно через 2 недели после входа пользователя в систему, и установка его на 30 минут проста.

Ответ 6

Вы можете попробовать добавить следующую строку в файл 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.