Ruby Rails:在数据库中存储会话的优势?
我只是想知道为什么要在数据库中存储会话?将会话存储在数据库中有什么好处吗?我能想到的两个原因是: 1) 如果重新启动web服务,会话数据不会丢失Ruby Rails:在数据库中存储会话的优势?,ruby,session,ruby-on-rails-3,Ruby,Session,Ruby On Rails 3,我只是想知道为什么要在数据库中存储会话?将会话存储在数据库中有什么好处吗?我能想到的两个原因是: 1) 如果重新启动web服务,会话数据不会丢失 2) 在负载平衡环境中,会话数据存储在中心位置,这意味着任何服务器都可以为请求提供服务并访问会话数据。数据库或memcached的优点是,会话数据在客户端不能被篡改,并且可以存储比cookie(4kB)更大的数据量 如果会话存储在cookie或数据库中,并且web服务重新启动,则会话数据不会丢失。只有当它存储在memcached中时,它才可能丢失 如果
2) 在负载平衡环境中,会话数据存储在中心位置,这意味着任何服务器都可以为请求提供服务并访问会话数据。数据库或memcached的优点是,会话数据在客户端不能被篡改,并且可以存储比cookie(4kB)更大的数据量 如果会话存储在cookie或数据库中,并且web服务重新启动,则会话数据不会丢失。只有当它存储在memcached中时,它才可能丢失 如果服务器是负载平衡的,那么会话数据将传递给为请求提供服务的web服务器,因此这不是cookie、数据库或memcached会话的问题 与memcached或数据库相比,cookies的优势在于客户端存储会话数据,因此服务器不负责
请记住,由于会话引用仍然需要维护,因此Cookie将以任何方式传递给客户端或从客户端传递出去。我至少可以想到三个原因。如果将会话保存在数据库中,则可以:
- 在您执行的任何Rails实例上轻松访问它。因此,如果您有多台机器,就不必担心会话数据的分发李>
- 您没有只有在使用cookie会话存储时才使用的4kb会话限制会话。虽然您不应该使用会话来存储对象,但有一天您可能会使用该功能
- 在使用和RDBM(而不是Memcached或任何其他非持久化存储)时,您不必担心丢失会话数据李>
类会话
也许吧。它是否保护了某种黑客行为?部分是的,将会话数据存储在cookie中会带来安全隐患:。至于#2,默认的基于cookie的存储也有这一好处。并不是说它本身没有问题,但这一好处并不是DB/Memcache存储所独有的。您所说的一切都是正确的,只是“数据不能被篡改”。会话劫持?会话劫持中,用户没有篡改客户端的会话数据。他们正在复制会话id cookie以获得对系统的访问权限,就像他们是经过身份验证的用户一样。存储在memcached中的会话将在web服务器重新启动后丢失?存储在memcached中的任何数据将在memcached重新启动后丢失。web服务器是一个不同的进程。由于web应用是无状态的,因此没有可靠的方法来确定到底有多少用户登录。计算会话数对这一点没有帮助。如果每次加载页面时触摸更新的_at参数,您可以看到在过去几天中加载了多少会话。如果会话cookie设置为在24小时后过期,则会告诉您谁仍在登录。您还可以通过删除用户的会话将其注销。
class Session < ActiveRecord::Base
def self.sweep(time = 1.hour)
if time.is_a?(String)
time = time.split.inject { |count, unit| count.to_i.send(unit) }
end
delete_all "updated_at < '#{time.ago.to_s(:db)}' OR
created_at < '#{2.days.ago.to_s(:db)}'"
end
end