¿Cómo configurar un tiempo de espera de sesión para la aplicación Grails?


En uno de los controladores de mi aplicación Grails conservo un valor de parámetro en una variable de sesión como esta:

session.myVariable = params.myValue

Después de eso, puedo acceder al valor guardado desde diferentes controladores/páginas GSP, siempre y cuando utilice activamente la aplicación. Sin embargo, si no utilizo mi aplicación durante un tiempo, a pesar de que la ventana de mi navegador todavía está abierta, la variable de sesión pierde su valor.

¿Esto sucede porque la sesión expira? Tenía la impresión de que una sesión vive hasta que el la ventana del navegador sigue abierta, pero al parecer me equivoqué.

¿Qué debo hacer para asegurarme de que todas las variables de sesión que defina en mi aplicación Grails no caduquen hasta que se cierre el navegador? ¿Hay alguna forma de establecer el tiempo de espera de la sesión manualmente?

Gracias de antemano por sus respuestas!

Author: Shashank Agrawal, 2010-05-25

7 answers

Otra opción sería modificar web.XML. Antes debe llamar

grails install-templates

Luego edite src/templates/war/web.xml y añadir / modificar después de servlet-mapping:

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

El valor de session-timeout usa minutos como unidad.

 82
Author: Stefan Armbruster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-25 20:12:48

Avance rápido unos años... Para Grails 3.0 establezca el tiempo de espera de la sesión con ServerProperties en el archivo de configuración de la aplicación.

Grails-app / conf / application.yml

server:
   session:
      timeout: 3600  #seconds

Valor predeterminado: 1800 segundos (30 minutos)

Verifique el tiempo de espera para el HttpSession desde un controlador usando getMaxInactiveInterval():

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

Salida --> Timeout: 3600 seconds

Actualización: Configuración editada para cambios en Grails 3.1

 31
Author: Dem Pilafian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-01 21:53:23

Los griales actuales (2.x) tener un enfoque de diseño muy extraño para establecer el tiempo de espera de la sesión. Ninguna de las ideas predominantes son grandes:

  1. Comente la sección " / / session Timeout "dentro del plugin WebxmlGrails y agregue" sessionConfig.SessionTimeout= " to Config.groovy

  2. Grails install-templates, remove session-timeout from web.xml, añadir tiempo de espera en WebXmlConfig.groovy

  3. Espera una dosis. :/

Un compañero de trabajo se le ocurrió la siguiendo el código que funciona bien para mí y lo hará hasta que una solución real esté integrada en grails core.

Simplemente agregue lo siguiente al final de su configuración.groovy archivo y luego establecer el tiempo de espera apropiado.

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>")
}

Mi sugiero que la solución correcta es permitir una sola línea en la configuración.archivo groovy:

session.timeout = 90;

Saludos.

 6
Author: Lord Voldemort,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-27 22:41:43

Con Griales 3.1.x session-timeout está obsoleto. La propiedad correcta en la aplicación .yml es:

server:
    session.timeout: 7200
 2
Author: Spencer McEwen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-08 15:15:54

Podría estar equivocado, pero estoy bastante seguro de que Grails usa las sesiones asociadas con su contenedor de aplicaciones. Si está utilizando Tomcat, por ejemplo, puede especificar la duración de una sesión.

Tutorial para cambiar la duración de la sesión de Tomcat.

 1
Author: Stefan Kendall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-25 18:49:23

Aquí hay una mejor solución de trabajo. ve a tu directorio principal de grails y encuentra Ejemplo: E:\grails-2.3.8\src\war\WEB-INF\web3.0.plantilla.xml edite el valor de tiempo de espera de la sesión a los valores deseados:

Ejemplo: enter code here 90

 1
Author: user3833729,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-13 06:49:07

Para la aplicación Grails 3, modificar el Application.groovy funcionó para mí:

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
Author: Shashank Agrawal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-02 14:25:25