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




session-variables session-timeout (7)

En uno de los controladores de mi aplicación Grails estoy preservando 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 que use 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!


Answers

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 para cambiar la duración de la sesión Tomcat.


Para la aplicación Grails 3, la modificación de 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
    }

}

Los actuales griales (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 predominantes es genial:

  1. comente la sección "// tiempo de espera de la sesión" dentro del complemento WebxmlGrails y agregue "sessionConfig.sessionTimeout =" a Config.groovy

  2. grails install-templates, eliminar session-timeout de web.xml, agregar tiempo de espera en WebXmlConfig.groovy

  3. espera una solución. : /

Un compañero de trabajo inventó el siguiente código que funciona bien para mí y lo hará hasta que se incorpore una solución real en el núcleo de Grails.

Simplemente agregue lo siguiente a la parte inferior de su archivo config.groovy y luego configure 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 el archivo Config.groovy:

session.timeout = 90;

Aclamaciones.


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: 1800 segundos (30 minutos)

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

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

Salida -> Timeout: 3600 seconds

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


Con Grails 3.1.x session-timeout está en desuso. La propiedad correcta en application.yml es:

server:
    session.timeout: 7200

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

grails install-templates

Luego edite src / templates / war / web.xml y agregue / modifique después de la asignación de servlets:

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

El valor de timeout de sesión usa minutos como unidad.


No. Los servlets no son seguros para hilos.

El es permite acceder a más de un hilo a la vez

Si quieres que sea Servlet como seguro para subprocesos, puedes ir por

Implement SingleThreadInterface(i) que es una interfaz en blanco que no hay

metodos

O podemos ir por los métodos de sincronización.

Podemos hacer todo el método de servicio como sincronizado utilizando sincronizado

Keword delante del método

Ejemplo::

public Synchronized class service(ServletRequest request,ServletResponse response)throws ServletException,IOException

O podemos poner el bloque puesto del código en el bloque sincronizado.

Ejemplo::

Synchronized(Object)

{

----Instructions-----

}

Siento que el bloque sincronizado es mejor que hacer todo el método.

Sincronizado





session grails session-variables session-timeout