我如何清除所有铁路会话?

时间:2010-06-19 04:06:06

标签: ruby-on-rails session

这是我的代码:

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

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

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

10 个答案:

答案 0 :(得分:48)

无论是DB还是Cookie存储,请使用rake tmp:sessions:clear

答案 1 :(得分:25)

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

rake db:sessions:clear

答案 2 :(得分:5)

在Rails 4中,接受的答案(rake db:sessions:clear)不再有效,因为ActiveRecord :: SessionStore被提取到active_record-session_store gem中。 (有关详细说明,请参阅here

您现在可以安装active_record-session_store gem并在Rails 3中使用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

答案 3 :(得分: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(这是默认设置)。然后你需要清理你的cookie,或使用reset_session。

答案 4 :(得分:2)

我使用Rails 4并且以下解决方案适用于我,因为我不想在每次启动应用程序时手动运行.Display

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

rake db:session:clear

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

答案 5 :(得分:2)

最好是更改部署中的密钥,所有cookie都将失效

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

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

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

rails tmp:clear  

答案 6 :(得分:2)

在Rails 5中使用ActiveRecord:

ActiveRecord::SessionStore::Session.delete_all

或更细粒度:

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

答案 7 :(得分:1)

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

initializers / 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

答案 8 :(得分:0)

要提出一个替代解决方案:如果身份验证是在另一个应用程序中完成的,则可以更改secret_key_base

答案 9 :(得分:0)

rake db:schema:cache:clear

这将清除使用Rails API时的缓存和所有会话,而对于其他数据库任务,则使用:

rake --tasks