我将如何清除所有 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 会话?的主要内容,如果未能解决你的问题,请参考以下文章
如何清除 Rails 动作缓存? (Rails.cache.clear 不起作用)