什么时候会在rails中销毁会话?

时间:2016-02-14 14:37:38

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

根据我的理解, 为某个用户初始化会话时

会话获取一个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,等等上。

这不会创建无限量的会话哈希吗? 当它们不被使用时,它们是否被垃圾收集?

2 个答案:

答案 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中,并且有自己的清理机制。