Как отключить сеансы Rails для веб-сканеров? - PullRequest
1 голос
/ 03 апреля 2012

Раньше такая строка в контроллере приложения полностью отключала сеансы для запроса:

session :off, :if => Proc.new {|req| req.user_agent =~ BOT_REGEX}

В Rails 3.x это устарело или больше не работает. Я понимаю, что новая концепция заключается в том, что сессии загружаются лениво, но поток выполнения через приложение использует / проверяет сессии, даже если это веб-бот.

Так есть ли какой-то новый механизм, который можно было бы использовать для отключения сеансов на основе запроса?

Ответы [ 2 ]

1 голос
/ 13 июля 2015

Я предполагаю, что ответ @ jordoh работает для cookie-файлов по умолчанию на rails, но у меня не работает использование active_record_store для хранения моих сеансов в базе данных.

Если вы используете active_record_store и хотитеостановить сеансы, создаваемые для ботов, это работает:

# Save this file as config/initializers/session_store_ext.rb 
# and don't forget to define BOT_REGEX

class ActiveRecord::SessionStore
  _set_session = instance_method :set_session

  define_method :set_session  do | env, sid, session_data, options |
    unless env['HTTP_USER_AGENT'] =~ BOT_REGEX
      _set_session.bind(self).call env, sid, session_data, options
    end

    sid
  end

  private :set_session
end

Я написал сообщение в блоге, подробно описывающее это - Условное отключение сеансов базы данных в Ruby on Rails 3

1 голос
/ 23 апреля 2012

Похоже, что в Rails 3 нет встроенного способа сделать это, но вы можете сделать обезьянку-патч SessionHash, чтобы получить аналогичный результат:

class ActionDispatch::Session::AbstractStore::SessionHash
  private
    def load_for_write!
      load! unless loaded? || (@env['HTTP_USER_AGENT'] =~ BOT_REGEX)
    end
end

Это предотвратит создание объекта хранилища сеансов. Вы по-прежнему сможете назначать хэш session и даже обращаться к тем же данным сеанса позже в том же запросе.

...