这是我的代码:
if session[:firsttimestart].nil?
else
@firsttime = false
end
if @firsttime == true
initglobals()
end
session[:firsttimestart]=false
问题是当我关闭服务器并返回应用程序时,会话[:firsttimestart]仍为false。它以某种方式将此变量存储在我的系统中而没有到期日期,因此不会调用iniglobals()。我试图使用rake tmp:clear但它没有用。每次重新启动服务器时,如何清除系统中正在使用的所有会话?
答案 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