web-dev-qa-db-fra.com

Comment configurer un délai de session pour l'application Grails?

Dans l'un des contrôleurs de mon application Grails, je conserve une valeur de paramètre dans une variable de session comme celle-ci:

session.myVariable = params.myValue

Après cela, je peux accéder à la valeur enregistrée à partir de différents contrôleurs/pages GSP aussi longtemps que j'utilise activement l'application. Cependant, si je n'utilise pas mon application pendant un certain temps, même si la fenêtre de mon navigateur est toujours ouverte, la variable de session perd sa valeur.

Est-ce que cela se produit parce que la session expire? J'avais l'impression qu'une session vivait jusqu'à ce que la fenêtre du navigateur soit toujours ouverte, mais apparemment, je me suis trompé.

Que dois-je faire pour m'assurer que toutes les variables de session que je définis dans mon application Grails n'expirent pas tant que le navigateur n'est pas fermé? Est-il possible de définir le délai d'expiration de la session manuellement?

Merci d'avance pour vos réponses!

57
curd0

Une autre option serait de modifier web.xml. Avant vous devez appeler

grails install-templates

Ensuite, éditez src/templates/war/web.xml et ajoutez/modifiez après le mappage de servlet:

<session-config>
   <session-timeout>60</session-timeout>
</session-config>

La valeur de session-timeout utilise les minutes comme unité.

82

Avance rapide de quelques années ... Pour Grails 3.0, définissez le délai de session avec ServerProperties dans le fichier de configuration de l'application.

grails-app/conf/application.yml

server:
   session:
      timeout: 3600  #seconds

Valeur par défaut: 1800 secondes (30 minutes)

Vérifiez le délai d’expiration du HttpSession depuis un contrôleur utilisant getMaxInactiveInterval():

log.println "Timeout: ${session.getMaxInactiveInterval()} seconds"

Sortie -> Timeout: 3600 seconds

Mise à jour: configuration modifiée pour les modifications dans Grails 3.1} _

32
Dem Pilafian

Les grails actuels (2.x) ont une approche de conception très étrange pour définir le délai d'expiration de la session. Aucune des idées dominantes n'est géniale:

  1. commentez la section "// session timeout" dans le plug-in WebxmlGrails et ajoutez "sessionConfig.sessionTimeout =" à Config.groovy

  2. grails install-templates, supprimez le délai de session du fichier web.xml, ajoutez un délai dans WebXmlConfig.groovy

  3. attendre une solution. : /

Un collègue a proposé le code suivant qui fonctionne bien pour moi et le fera jusqu’à ce qu’une véritable solution soit intégrée au cœur de Grails. 

Ajoutez simplement ce qui suit au bas de votre fichier config.groovy, puis définissez le délai d’expiration approprié.

grails.war.resources = { stagingDir, args ->
  def webXML = new Java.io.File("${stagingDir}/WEB-INF/web.xml")
  webXML.text = webXML.text.replaceFirst("<session-timeout>30</session-timeout>", "<session-timeout>90</session-timeout>")
}

Mon je suggère que la bonne solution est d'autoriser une seule ligne dans le fichier Config.groovy:

session.timeout = 90;

À votre santé.

6
Lord Voldemort

Avec Grails 3.1.x, session-timeout est obsolète. La propriété correcte dans application.yml est:

server:
    session.timeout: 7200
2
Spencer McEwen

voici une meilleure solution de travail. allez dans votre répertoire personnel grails et trouvez .__ Exemple: E:\grails-2.3.8\src\war\WEB-INF\web3.0.template.xml modifier la valeur du délai d’expiration de la session:

Exemple: enter code here 90

1
user3833729

Je peux me tromper, mais je suis à peu près sûr que Grails utilise les sessions associées à votre conteneur d'applications. Si vous utilisez Tomcat, par exemple, vous pouvez spécifier la durée d'une session.

Tutoriel pour changer la durée de la session Tomcat.

1
Stefan Kendall

Pour l’application Grails 3, modifier le Application.groovy a fonctionné pour moi:

package foo

import grails.boot.GrailsApp
import grails.boot.config.GrailsAutoConfiguration
import org.Apache.catalina.Context
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory
import org.springframework.boot.context.embedded.Tomcat.TomcatContextCustomizer
import org.springframework.boot.context.embedded.Tomcat.TomcatEmbeddedServletContainerFactory
import org.springframework.context.annotation.Bean

class Application extends GrailsAutoConfiguration {

    static void main(String[] args) {
        GrailsApp.run(Application, args)
    }

    @Bean
    EmbeddedServletContainerFactory containerFactory() {
        TomcatEmbeddedServletContainerFactory containerFactory = new TomcatEmbeddedServletContainerFactory()

        containerFactory.addContextCustomizers(new TomcatContextCustomizer() {
            @Override
            void customize(Context context) {
                int oneWeekInMinute = 7 * 24 * 60
                context.setSessionTimeout(oneWeekInMinute)
            }
        });

        return containerFactory
    }

}
0
Shashank Agrawal