Voici mon code:
if session[:firsttimestart].nil?
else
@firsttime = false
end
if @firsttime == true
initglobals()
end
session[:firsttimestart]=false
Le problème est que lorsque j'éteins le serveur et que je reviens à l'application, la session [: firsttimestart] est toujours fausse. En quelque sorte, il stocke cette variable dans mon système sans date d'expiration, de sorte que iniglobals () n'est pas appelée. J'ai essayé d'utiliser rake tmp: clear et cela n'a pas fonctionné. Comment puis-je effacer toutes les sessions que j'utilise dans mon système chaque fois que je redémarre mon serveur?
Si vous stockez vos sessions dans une base de données,
rake db:sessions:clear
Que ce soit une base de données ou un magasin de cookies, utilisez rake tmp:sessions:clear
Dans Rails 4, la réponse acceptée (rake db:sessions:clear
) ne fonctionne plus car ActiveRecord :: SessionStore a été extrait dans la gem active_record-session_store
. (Voir ici pour plus d'explications)
Vous pouvez maintenant installer la gemme active_record-session_store
et utiliser rake db:sessions:clear
comme dans Rails 3, ou créer une tâche de rake personnalisée ressemblant à ceci:
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
Premièrement, nil n'est pas == faux, cependant, nil est évalué à faux. Essayez vous-même si vous ne croyez pas:
irb(main):001:0> nil == false
=> false
irb(main):002:0> nil == nil
=> true
Quel cours signifie:
irb(main):003:0> false.nil?
=> false
Vous pouvez nettoyer votre code de la manière suivante, car il semble que @firsttime n'est jamais défini sur true, où que ce soit.
unless session[:visited]
session[:visited] = true
initglobals
end
Enfin, rake tmp: sessions: clear ne fonctionnera que si vous utilisez ActiveRecordStore, si vous utilisez CookieStore (valeur par défaut). Ensuite, vous devrez nettoyer vos cookies ou utiliser reset_session.
Le mieux est de changer la clé secrète du déploiement, tous les cookies seront invalidés
techniquement, vous devriez déjà en fournir un via une variable d'environnement.
http://guides.rubyonrails.org/security.html#custom-secrets
pour la tâche de rake, il semble que le nouveau est
Rails tmp:clear
Dans Rails 5 si vous utilisez ActiveRecord:
ActiveRecord::SessionStore::Session.delete_all
ou pour plus granulaire:
# For example schedule this once a day`
ActiveRecord::SessionStore::Session.where(["updated_at < ?", 2.weeks.ago]).delete_all
J'utilise Rails 4 et la solution suivante a fonctionné pour moi car je ne veux pas exécuter manuellement rake db:session:clear
à chaque démarrage de mon application.
Dans /config/initializer/session_store.rb, ajoutez ce qui suit
ActiveRecord::SessionStore::Session.delete_all
Ceci est identique à la commande rake mais effectué au niveau de l’initialiseur.
Pour présenter une solution alternative: vous pouvez modifier le secret_key_base
- si l'authentification est effectuée dans une autre application.