我只是想知道为什么在数据库中存储会话?在数据库中存储会话有什么好处吗?
答案 0 :(得分:24)
数据库或memcached的优点是会话数据无法在客户端被篡改,并且您可以存储比使用cookie(4kB)更多的数据。
如果您的会话存储在Cookie或数据库中并且重新启动了Web服务,则会话数据不会丢失。如果它存储在memcached中,它可能只会丢失。
如果服务器是负载平衡的,那么会话数据将传递给服务请求的Web服务器,因此这不是cookie,数据库或memcached会话的问题。
cookie优于memcached或数据库的优点是客户端存储会话数据,因此服务器不对其负责。
请记住,无论哪种方式都会向客户端传递Cookie,因为仍需要维护会话引用。
答案 1 :(得分:18)
我能想到的两个原因是:
1)如果重新启动Web服务,会话数据不会丢失
2)在负载平衡环境中,会话数据存储在一个中心位置,这意味着任何服务器都可以提供请求并可以访问会话数据。
答案 2 :(得分:7)
我至少有三个理由可以想到。如果您将会话保存在数据库中,您可以:
答案 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