根据我的理解, 为某个用户初始化会话时
会话获取一个hash和session_id来识别它。
ex. session[key]=value
session_id = 23f8fzsj2048j20j
现在,在注销用户时,我知道您只需设置
即可session[:user_id] = nil
但是实际会话哈希会发生什么?
如果我没有错,如果有用户A,B和C,他们每个人都会被分配一个唯一的会话,例如用户A的session_id = 12345abc,用户B的session_id = 23456abc,等等上。
这不会创建无限量的会话哈希吗? 当它们不被使用时,它们是否被垃圾收集?
答案 0 :(得分:2)
这完全取决于你用来存储哈希的机制,但简短的回答是:不,会话不是垃圾收集的,而且通常不需要。
默认情况下,会话使用CookieStore存储。有没有服务器端数据,所有cookie数据都被加密并存储在cookie中。用户的浏览器负责清理。
您可以使用备用会话存储引擎,例如ActiveRecord sesssion store,它将会话数据存储在数据库中。这样做需要您手动选择何时考虑记录“已过期”,并实施自己的清理代码,再次,它们不自动“垃圾收集”:How does Rails know when to delete a record from the `sessions` table? < / p>
答案 1 :(得分:1)
我不确定你对session_id的意思,但默认情况下会话使用的是保存在用户浏览器中的cookie。
如果您想更多地参考相关代码,建议您阅读此内容https://github.com/rails/rails/blob/3ac3760c69e6e6914c5ddae138856b3c82ac0f20/actionpack/lib/action_dispatch/middleware/session/cookie_store.rb,然后继续查看Cookie的Rack
实现。
对于在记录用户的情况下使会话无效,大多数身份验证框架都会检查一个特殊的cookie,其中包含用户登录后设置的用户ID,以及在cookie中找不到该值时基本上退出了。
在请求周期中初始化的哈希本身存在于内存中,并且将在请求 - 响应周期结束时进行垃圾收集,以非常简单的方式,您的哈希存在于堆中并被垃圾收集。
它引用的数据存在于浏览器的cookiejar中,并且有自己的清理机制。