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!
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é.
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} _
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:
commentez la section "// session timeout" dans le plug-in WebxmlGrails et ajoutez "sessionConfig.sessionTimeout =" à Config.groovy
grails install-templates, supprimez le délai de session du fichier web.xml, ajoutez un délai dans WebXmlConfig.groovy
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é.
Avec Grails 3.1.x, session-timeout est obsolète. La propriété correcte dans application.yml est:
server:
session.timeout: 7200
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
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.
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
}
}