我将如何清除所有 Rails 会话?

Posted

技术标签:

【中文标题】我将如何清除所有 Rails 会话?【英文标题】:How would I clear all rails sessions? 【发布时间】:2011-03-05 16:41:37 【问题描述】:

这是我的代码:

if session[:firsttimestart].nil? 
else
  @firsttime = false
end

if @firsttime == true
  initglobals()
end
session[:firsttimestart]=false

问题是当我关闭服务器并返回应用程序时,会话 [:firsttimestart] 仍然是错误的。它以某种方式将此变量存储在我的系统中而没有到期日期,因此不会调用 iniglobals()。我尝试使用 rake tmp:clear 并没有用。每次重新启动服务器时,如何清除系统中正在使用的所有会话?

【问题讨论】:

【参考方案1】:

不管是DB还是cookie store,都用rake tmp:sessions:clear

【讨论】:

显然不能用于 cookie 存储,因为会话保留在客户端。 @dolzenko 只有一个 session_id 存储在客户端。所有会话数据都存储在服务器端。所以你不应该有任何理由不能从服务器端清除 cookie 会话。 @Nick 这仅适用于 DB 会话存储,cookie 存储存储客户端的所有内容,详情请参阅 guides.rubyonrails.org/security.html#session-storage 和 api.rubyonrails.org/classes/ActionDispatch/Session/… 啊,我不知道 Rails 使用了这种非常规的策略,但看起来你确实是对的。 放弃后这救了我。【参考方案2】:

如果您将会话存储在数据库中,那么

rake db:sessions:clear

【讨论】:

虽然,这可能不会缩小您的数据库磁盘空间。在 postgres 中,我需要在清除会话后运行以下命令:VACUUM FULL ANALYZE;REINDEX table sessions;。在其他关系数据库中,您可能也需要对其进行优化。 见下面@Yevgeniy 的回答 如果您不使用 DB 来存储会话,在 Rails 3 上,您只需更改应用程序的秘密令牌,所有会话都将被重置。为此,请在命令行上运行 rake secret 以生成新密钥,然后将其复制/粘贴到您的 config/initializers/secret_token.rb 文件中。【参考方案3】:

在 Rails 4 中,接受的答案 (rake db:sessions:clear) 不再有效,因为 ActiveRecord::SessionStore 被提取到 active_record-session_store gem 中。 (更多解释见here)

您现在可以像在 Rails 3 中一样安装 active_record-session_store gem 并使用 rake db:sessions:clear,或者创建一个如下所示的自定义 Rake 任务:

namespace :db do
    namespace :sessions do
        desc "Clear ActiveRecord sessions"
        task :clear => :environment do
            sql = 'TRUNCATE sessions;'
            ActiveRecord::Base.connection.execute(sql)
        end
    end
end

【讨论】:

【参考方案4】:

首先,nil 不是 == false,但是,nil 的计算结果为 false。不信可以自己试试:

irb(main):001:0> nil == false
=> false
irb(main):002:0> nil == nil
=> true

这当然意味着:

irb(main):003:0> false.nil?
=> false

您可以通过以下方式清理您的代码,因为似乎 @firsttime 在任何地方都不会设置为 true。

unless session[:visited]
  session[:visited] = true
  initglobals
end

最后,rake tmp:sessions:clear 仅在您使用 ActiveRecordStore 时才有效,如果您使用的是 CookieStore(这是默认设置)。然后你需要清理你的cookies,或者使用reset_session。

【讨论】:

【参考方案5】:

我正在使用 Rails 4,以下解决方案对我有用,因为我不想在每次启动应用程序时手动运行 rake db:session:clear

在 /config/initializer/session_store.rb 里面添加以下内容

ActiveRecord::SessionStore::Session.delete_all

这与 rake 命令相同,但在初始化程序级别完成。

【讨论】:

【参考方案6】:

最好在部署时更改密钥,所有 cookie 都会失效

从技术上讲,您应该已经通过环境变量提供了一个。

http://guides.rubyonrails.org/security.html#custom-secrets

对于 rake 任务,看起来是新的

rails tmp:clear  

【讨论】:

【参考方案7】:

如果使用 ActiveRecord,则在 Rails 5 中:

ActiveRecord::SessionStore::Session.delete_all

或更细化:

# For example schedule this once a day`
ActiveRecord::SessionStore::Session.where(["updated_at < ?", 2.weeks.ago]).delete_all

【讨论】:

我在控制台中尝试了这个,它给了我 NameError 的错误:未初始化的常量 ActiveRecord::SessionStore。知道为什么这不起作用。 你可以只使用“Session”而不是“ActiveRecord::SessionStore::Session”【参考方案8】:

至少对于存储在 cookie 中的会话,您只需更改会话存储密钥:

初始化程序/session_store.rb:

Rails.application.config.session_store :cookie_store, key: '_my_new_session_key'

根据 Rails API:...更改您的 secret_key_base 将使所有现有会话无效

https://api.rubyonrails.org/v5.2.1/classes/ActionDispatch/Session/CookieStore.html

【讨论】:

【参考方案9】:

提供替代解决方案:您可以更改secret_key_base - 如果身份验证在另一个应用程序中完成。

【讨论】:

【参考方案10】:
rake db:schema:cache:clear

这会在使用 rails API 时清除缓存和所有会话,对于其他数据库任务使用:

rake --tasks

【讨论】:

以上是关于我将如何清除所有 Rails 会话?的主要内容,如果未能解决你的问题,请参考以下文章

部署到heroku后如何清除rails缓存?

如何在不注销的情况下清除所有会话变量

如何清除所有会话变量而不退出

如何清除 Rails 动作缓存? (Rails.cache.clear 不起作用)

用于清除 Laravel 中所有会话数据的 Artisan 命令

在应用程序退出时清除数据