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

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

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

6 ответов

Решение

Я наткнулся на этот вопрос после разговора в офисе. Просто для полноты картины я обнаружил, что можно завершать сеансы после периода бездействия, и он встроен в Rails. В config/environment.rb сделайте что-то вроде:

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

Проверьте http://github.com/rails/rails/blob/2-3-stable/actionpack/lib/action_controller/session/cookie_store.rb#L114 для (очевидно недокументированного) варианта в действии. Похоже, что это было с момента перехода на сессию Rack в декабре 2008 года.

В идеале вы хотели бы добавить что-то подобное в environment.rb:

session :session_expires => 1.day.from_now

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

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

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

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

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


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

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


Конечно, примите во внимание, что плагин старый и может не работать с вашей текущей версией 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.

Другие вопросы по тегам