Подтвердить что ты не робот

Как я могу очистить все сеансы рельсов?

Вот мой код:

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

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

Проблема в том, что когда я выключу сервер и вернусь к приложению, сеанс [: firsttimestart] по-прежнему является ложным. Он каким-то образом сохраняет эту переменную в моей системе без истечения срока действия, поэтому iniglobals() не вызывается. Я попытался использовать rake tmp: clear, и это не сработало. Как я могу очистить все сеансы, которые я использую в своей системе, каждый раз, когда я перезапускаю свой сервер?

4b9b3361

Ответ 1

Если вы сохраняете свои сеансы в db, тогда

rake db:sessions:clear

Ответ 2

Будь то БД или хранилище файлов cookie, используйте rake tmp:sessions:clear

Ответ 3

В Rails 4 принятый ответ (rake db:sessions:clear) больше не работает, потому что ActiveRecord:: SessionStore был извлечен в камень active_record-session_store. (См. здесь для дальнейшего объяснения)

Теперь вы можете установить драгоценный камень active_record-session_store и использовать rake db:sessions:clear, как в Rails 3, или создать настраиваемую задачу 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 (который по умолчанию). Затем вам нужно будет очистить файлы cookie или использовать 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

для задачи рейка, это выглядит как новый

rails tmp:clear  

Ответ 7

В 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

Ответ 8

Чтобы представить альтернативное решение: вы можете изменить secret_key_base - если аутентификация выполняется в другом приложении.

Ответ 9

По крайней мере, для сеансов, хранящихся в файлах 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