【问题标题】:How would I clear all rails sessions?我将如何清除所有 Rails 会话?
【发布时间】: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 并没有用。每次重新启动服务器时,如何清除系统中正在使用的所有会话?

【问题讨论】:

    标签: ruby-on-rails session


    【解决方案1】:

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

    【讨论】:

    • 显然不能用于 cookie 存储,因为会话保留在客户端。
    • @dolzenko 只有一个 session_id 存储在客户端。所有会话数据都存储在服务器端。所以你不应该有任何理由不能从服务器端清除 cookie 会话。
    • @Nick 这仅适用于 DB 会话存储,cookie 存储存储客户端的所有内容,详情请参阅 guides.rubyonrails.org/security.html#session-storageapi.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
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2012-04-22
                  • 2014-06-14
                  • 1970-01-01
                  • 2017-12-10
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多