我读过 Rails 3 中的会话是延迟加载的,但我没有看到这种行为。为了测试这一点,我使用 MySQL 和 activerecord 会话存储创建了一个新的 Rails 3.2 应用程序。除了 V8 JavaScript 引擎,没有添加任何 gem。然后我用索引操作创建了一个名为 welcome 的空控制器。这里根本没有代码。当我点击索引页面时,我看到在 MySQL 的会话表中创建了一个会话。
难道我做错了什么?我认为只有当我访问它时才会创建一个会话。
我读过 Rails 3 中的会话是延迟加载的,但我没有看到这种行为。为了测试这一点,我使用 MySQL 和 activerecord 会话存储创建了一个新的 Rails 3.2 应用程序。除了 V8 JavaScript 引擎,没有添加任何 gem。然后我用索引操作创建了一个名为 welcome 的空控制器。这里根本没有代码。当我点击索引页面时,我看到在 MySQL 的会话表中创建了一个会话。
难道我做错了什么?我认为只有当我访问它时才会创建一个会话。
我猜这是 Ruby on Rails 从 3.0 版开始的默认行为。看:
http://guides.rubyonrails.org/security.html#cross-site-request-forgery-csrf
如果您需要停止在数据库中为机器人/爬虫创建会话,这对我有用:
# Save this file as config/initializers/session_store_ext.rb
# and don't forget to define BOT_REGEX to match bots/crawlers
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
我写了一篇博文,解释了我是如何创建它的以及它为什么起作用 - Conditionally Disabling Database Sessions in Ruby on Rails 3