Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 如何为web爬虫禁用Rails会话?_Ruby On Rails 3_Session_Web Crawler - Fatal编程技术网

Ruby on rails 3 如何为web爬虫禁用Rails会话?

Ruby on rails 3 如何为web爬虫禁用Rails会话?,ruby-on-rails-3,session,web-crawler,Ruby On Rails 3,Session,Web Crawler,过去,应用程序控制器中的类似行会完全禁用请求的会话: session :off, :if => Proc.new {|req| req.user_agent =~ BOT_REGEX} 在Rails3.x中,这可能已被弃用,也可能不再有效。我意识到新的概念是会话是延迟加载的,但是通过应用程序的执行流使用/检查会话,即使它是一个web机器人 那么,是否有一些新的机制可以用于在每个请求的基础上禁用会话?在Rails 3中似乎没有内置的方法来实现这一点,但您可以使用monkey patchSe

过去,应用程序控制器中的类似行会完全禁用请求的会话:

session :off, :if => Proc.new {|req| req.user_agent =~ BOT_REGEX}
在Rails3.x中,这可能已被弃用,也可能不再有效。我意识到新的概念是会话是延迟加载的,但是通过应用程序的执行流使用/检查会话,即使它是一个web机器人


那么,是否有一些新的机制可以用于在每个请求的基础上禁用会话?

在Rails 3中似乎没有内置的方法来实现这一点,但您可以使用monkey patch
SessionHash
来获得类似的结果:

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

这将阻止创建会话存储对象。您仍然可以分配到
会话
散列,甚至可以稍后在同一请求中访问相同的会话数据

我假设@jordoh的答案适用于默认的rails cookie_存储,但不适用于使用active_record_存储在数据库中存储会话的我

如果您使用的是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

我写了一篇博客文章详细介绍了这一点-

嗯-这真的很有趣。你怎么知道的?也就是说,我如何为自己验证这一点?我猜SessionHash.load_的源代码是用来写的!方法?您可以通过将您的用户代理设置为将被检测为bot的内容(例如),删除您可能拥有的任何现有会话cookie,并浏览您的站点来手动测试。每个action Rails日志都应该有一行“No session found”-或者如果您使用的是ActiveRecord SessionStore,您可以查看会话表,并验证是否没有新的会话记录添加到数据库中。谢谢,但我想知道的是,您是如何想出这个解决方案的?你怎么知道你可以做这种代码替换?最后,在Rails启动序列中,放置代码的最佳位置是哪里?我检查了
SessionHash
的源代码,了解了它的基本功能,然后在
load中放置了一个断点
并发出一些请求以了解典型的调用路径。在验证Rails的惰性会话创建确实依赖于
load\u进行写入之后
为了创建会话,我通过替换
load\u for\u write的实现从未调用过
加载(除非已加载,否则用于写入!
load\u的原始正文为
load!
)。我发布的代码只是为了更改行为。您可以将此代码添加到路径为
config/initializers/action\u dispatch\u mods.rb
的文件中,它将在Rails启动过程中自动应用。