如何清空/销毁 Rails 中的会话?

Posted

技术标签:

【中文标题】如何清空/销毁 Rails 中的会话?【英文标题】:How to empty/destroy a session in rails? 【发布时间】:2011-01-25 05:25:46 【问题描述】:

我似乎在任何地方都找不到它...如何在 Rails 中删除/销毁/重置/清空/清除用户的会话?不仅仅是一个价值,而是整个事情..

【问题讨论】:

【参考方案1】:

要清除整个事情,请使用控制器中的 reset_session 方法。

reset_session

这是有关此方法的文档:http://api.rubyonrails.org/classes/ActionController/Base.html#M000668

通过清除所有来重置会话 存储在其中的对象和 初始化一个新的会话对象。

祝你好运!

【讨论】:

对于基于数据库的会话(您可能应该使用),您可以通过查询过期:guides.rubyonrails.org/security.html#session-expiry【参考方案2】:

rails 中的会话是一个哈希对象。因此,任何可用于清除哈希的函数都适用于会话。

session.clear

或 如果必须销毁特定的密钥:

session.delete(key)

在 Rails 3.2 中测试

添加

session= 提到的人们是个坏主意。关于session.clear,Lobati cmets- 看起来你可能最好使用reset_session [比session.clear],因为它会做一些超出session.clear 的其他清理工作。在内部,reset_session calls session.destroy、which itself calls clear as well some other stuff.

【讨论】:

有人对这种方法与 Gdeglin 推荐的方法相比有何优点? 当你想保留其他参数但删除一个特定的键值对时,可以使用它。 这根本不会重置会话,它会分配一个局部变量。永远不要使用这种技术来重置会话:session = Rails documentation,在 5.1 访问会话 部分建议使用 reset_session 如果您想删除脚本插入的键/值对(例如:从控制器插入的东西)并生成一个新会话。如果您只想重置您设置的键/值对,请将这些键设置为 nil。 @barlop 看起来你可能最好使用reset_session,因为它除了session.clear 之外还有其他一些清理功能。在内部,reset_session calls session.destroy,其中itself calls clear as well some other stuff。【参考方案3】:

要仅清除某些参数,您可以使用:

[:param1, :param2, :param3].each  |k| session.delete(k) 

【讨论】:

【参考方案4】:

删除用户的会话

session.delete(:user_id)

【讨论】:

小心,可以从数据库中删除用户记录! @Arthur 这不是真的。但是您只会从会话中删除 :user_id 键,而不是整个会话【参考方案5】:

将此代码添加到您的 ApplicationController

def reset_session
  @_request.reset_session
end

( 不知道为什么上面没有人只提到这段代码 因为它解决了我的问题) http://apidock.com/rails/ActionController/RackDelegation/reset_session

【讨论】:

我发现@_request.reset_sessionreset_session 都可以工作并且可能做同样的事情?

以上是关于如何清空/销毁 Rails 中的会话?的主要内容,如果未能解决你的问题,请参考以下文章

如何销毁 Symfony 2 中的所有会话

Rails 3:如何识别观察者中的 after_commit 动作? (创建/更新/销毁)

如何正确销毁 ruby​​ on rails 中的关联记录?

如何一键销毁php会话

销毁 Rails 中所有延迟的工作

单击浏览器的后退按钮时如何销毁会话