簡體   English   中英

我如何清除所有 Rails 會話?

[英]How would I clear all rails sessions?

這是我的代碼:

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

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

問題是當我關閉服務器並返回到應用程序時,會話 [:firsttimestart] 仍然是錯誤的。 它以某種方式將此變量存儲在我的系統中而沒有到期日期,因此不調用 iniglobals()。 我嘗試使用 rake tmp:clear 並且沒有用。 每次重新啟動服務器時,如何清除系統中正在使用的所有會話?

無論是 DB 還是 cookie 存儲,使用rake tmp:sessions:clear

如果您將會話存儲在數據庫中,那么

rake db: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(這是默認設置)。 然后你需要清理你的cookies,或者使用reset_session。

我正在使用 Rails 4,以下解決方案對我有用,因為我不想每次啟動應用程序時都手動運行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

至少對於存儲在 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

提出替代解決方案:您可以更改secret_key_base - 如果身份驗證是在另一個應用程序中完成的。

rake db:schema:cache:clear

這會在使用 rails API 時清除緩存和所有會話,對於其他數據庫任務,請使用:

rake --tasks

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM