2010-05-25 23 views
56

En uno de los controladores en mi aplicación Grails estoy preservando un valor de parámetro en una variable de sesión como esto:¿Cómo configurar un tiempo de espera de sesión para la aplicación Grails?

session.myVariable = params.myValue 

Después de eso, se puede acceder al valor salvado de diferentes controladores/SGP-páginas, siempre y cuando Yo uso activamente la aplicación. Sin embargo, si no uso mi aplicación durante un tiempo, aunque la ventana de mi navegador aún 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 la ventana del navegador todavía está abierta, pero aparentemente estaba equivocado.

¿Qué debo hacer para garantizar que todas las variables de sesión que defino 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!

Respuesta

81

Otra opción sería modificando web.xml. Antes debe llamar

grails install-templates 

Entonces edición src/templates/guerra/web.xml y añadir/modificar después de servlet-mapping:

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

El valor de tiempo de espera de sesión utiliza como unidad de minutos.

+0

Gracias, Stefan! Eso es * EXACTAMENTE * lo que estaba buscando. No me di cuenta de que tengo que 'instalar-plantillas' explícitamente para llegar a web.xml. Todavía soy un n00b en Grails :) – curd0

+2

También quiero manejar un tiempo de espera de sesión. Solo tengo una pregunta sobre esto. Al configurar esto en el archivo web.xml, ¿qué sucedería una vez que la sesión expire y se ejecute una acción desde un controlador? ¿La sesión.myVariable del ejemplo de @curd0 devolverá nulo? ¡Gracias! – Tomarto

+1

no es 100% seguro, pero creo que es nulo –

1

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

Tutorial for changing Tomcat session length.

+0

Griales hace uso de las sesiones del contenedor, pero simplemente reemplazando el defecto doesn' t funciona porque grails generará un nuevo servlet específico web.xml que anulará el predeterminado. – codemonkey

5

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

  1. la sección de comentario "// Tiempo de espera de sesión de" la WebxmlGrails dentro del Plugin y añadir "sessionConfig.sessionTimeout =" a Config.groovy

  2. Grails instalar las plantillas , elimine session-timeout de web.xml, agote el tiempo de espera en WebXmlConfig.groovy

  3. espere una solución. :/

Un compañero de trabajo le ocurrió el siguiente código que funciona bien para mí y lo hará hasta que una solución real está integrado en griales núcleo.

Simplemente agregue lo siguiente a la parte inferior de su archivo config.groovy y luego configure el tiempo de espera adecuado.

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 I sugieren que la solución correcta es permitir que una sola línea en el archivo Config.groovy:

session.timeout = 90; 

Saludos.

+0

¿Quiere decir "agregar lo siguiente al pie de su ** Build ** Config.groovy"? –

1

aquí hay una mejor solución de trabajo. ve a tu directorio principal de Grails y encuentra Ejemplo: E: \ grails-2.3.8 \ src \ guerra \ WEB-INF \ web3.0.template.xml editar el tiempo de la sesión a cabo valor a los valores deseados:

Ejemplo: enter code here

28

avance rápido de 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: segundos (30 minutos)

verificar el tiempo de espera para la HttpSession desde un controlador utilizando getMaxInactiveInterval():

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

fuera poner ->Timeout: 3600 seconds

Actualización: Editado configuración para cambios en Grails 3,1

+2

En realidad ahora es servidor: session: timeout: 3600 – Kimi

+0

Gracias @Kimi, la respuesta ha sido actualizada. –

+0

cómo desactivar el tiempo de espera de la sesión? @DemPilafian – akiong

2

Con Grails está en desuso 3.1.x sesión de tiempo de espera. La propiedad correcta en application.yml es:

server: 
    session.timeout: 7200 
0

Para Griales 3 aplicación, la modificación de la Application.groovy trabajado 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 
    } 

} 
Cuestiones relacionadas