2010-06-19 15 views
25

這裏是我的代碼:我將如何清除所有導軌會話?

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

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

問題是,當我關掉服務器,然後回來給應用程序,會話[:firsttimestart]還是假的。它以某種方式將此變量存儲在我的系統中,但沒有過期日期,因此不會調用iniglobals()。我試圖使用rake tmp:清除並且不起作用。每次重新啓動服務器時,如何清除系統中使用的所有會話?

回答

23

如果你是存儲您的會話在分貝然後

rake db:sessions:clear 
+0

雖然這可能不會縮小您的數據庫磁盤空間。在postgres中,我需要在清除會話後運行以下代碼:'VACUUM FULL ANALYZE;'和'REINDEX表會話;'。在其他關係數據庫中,您可能還需要優化它。 – 2013-02-06 11:32:43

+0

查看@ Yevgeniy的回答如下 – aceofspades 2014-09-28 20:04:03

+0

如果您不使用數據庫來存儲會話,請在Rails 3上,然後您只需更改應用的祕密令牌,所有會話都將被重置。爲此,請在命令行上運行'rake secret'來生成一個新密碼,然後將其複製/粘貼到config/initializers/secret_token.rb文件中。 – Alberto 2016-12-28 21:46:48

4

首先,無不是==假的,但零計算爲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 

最後,耙TMP:會話:如果您使用的爲ActiveRecordStore,明確將只工作,如果你正在使用的CookieStore(這是默認值)。然後,您需要清理Cookie,或使用reset_session。

45

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

+0

顯然不能用於cookie存儲,因爲會話保留在客戶端。 – dolzenko 2014-09-05 10:13:42

+0

@dolzenko只有一個session_id存儲在客戶端。所有會話數據都存儲在服務器端。所以不應該有任何理由你不能清除服務器端的cookie會話。 – Nick 2015-07-08 13:59:59

+1

@Nick這僅適用於數據庫會話存儲,Cookie存儲存儲客戶端的所有內容,請參閱http://guides.rubyonrails.org/security.html#session-storage和http://api.rubyonrails.org/classes/ ActionDispatch/Session/CookieStore.html的詳細信息 – dolzenko 2015-07-09 15:14:15

5

在Rails 4,接受的答案(rake db:sessions:clear)不再有效,因爲ActiveRecord的:: SessionStore提取到對active_record-session_store寶石。 (進一步解釋見here

現在,您可以任意安裝active_record-session_store寶石和Rails 3中使用rake db:sessions:clear作爲,或創建一個自定義Rake任務,看起來像這樣:我使用的Rails

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 
2

4和以下解決方案爲我工作,因爲我不想每次啓動我的應用程序時手動運行rake db:session:clear

內/config/initializer/session_store.rb添加以下

ActiveRecord::SessionStore::Session.delete_all 

這僅僅是一樣的rake命令,但在初始水平上進行。

1

在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