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

这是我的代码:

if session[:firsttimestart].nil? else @firsttime = false end if @firsttime == true initglobals() end session[:firsttimestart]=false 

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

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

 rake db:sessions:clear 

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

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

您现在可以安装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 

首先,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。

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

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

 ActiveRecord::SessionStore::Session.delete_all 

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

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

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

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

对于rake任务,它看起来像是新任务

 rails tmp:clear 

在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 

要提供替代解决方案:您可以更改secret_key_base – 如果身份validation是在另一个应用程序中完成的。