Rails:在数据库中存储会话的优点?

时间:2010-11-25 15:28:22

标签: ruby session ruby-on-rails-3

我只是想知道为什么在数据库中存储会话?在数据库中存储会话有什么好处吗?

5 个答案:

答案 0 :(得分:24)

数据库或memcached的优点是会话数据无法在客户端被篡改,并且您可以存储比使用cookie(4kB)更多的数据。

如果您的会话存储在Cookie或数据库中并且重新启动了Web服务,则会话数据不会丢失。如果它存储在memcached中,它可能只会丢失。

如果服务器是负载平衡的,那么会话数据将传递给服务请求的Web服务器,因此这不是cookie,数据库或memcached会话的问题。

cookie优于memcached或数据库的优点是客户端存储会话数据,因此服务器不对其负责。

请记住,无论哪种方式都会向客户端传递Cookie,因为仍需要维护会话引用。

答案 1 :(得分:18)

我能想到的两个原因是:

1)如果重新启动Web服务,会话数据不会丢失

2)在负载平衡环境中,会话数据存储在一个中心位置,这意味着任何服务器都可以提供请求并可以访问会话数据。

答案 2 :(得分:7)

我至少有三个理由可以想到。如果您将会话保存在数据库中,您可以:

  • 可以在您执行的任何Rails实例上轻松访问它。因此,如果您有多台计算机,则无需担心分发会话数据。
  • 您没有仅在使用Cookie会话存储时适用的4kb会话限制会话。虽然您不应该使用会话来存储对象,但有一天您可能会使用该功能。
  • 使用和RDBM(而不是Memcached或任何其他非持久存储)时,您不必担心会丢失会话数据。

答案 3 :(得分:2)

在数据库中使用会话的一个不那么明显和小的优点是,如果您需要计算当前会话并查看其他登录用户的名称,那么与仅使用cookie存储会话数据相比,它更容易实现或memcached。

答案 4 :(得分:2)

另一个优点是在服务器端处理会话到期,如2.9节所述:

http://guides.rubyonrails.org/security.html

“但是客户端可以编辑存储在Web浏览器中的cookie,因此服务器上的过期会话更安全。”

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