2012-04-19 25 views
5

Estoy usando el framework Scalatra para crear una aplicación web. La aplicación depende de las sesiones, pero no puedo usar las cookies de sesión (porque técnicamente solo hay un usuario, que ejecuta varias sesiones simultáneamente).Sesión Scalatra sin cookies

Cada sesión tiene una clave de sesión única que quiero usar como identificador. Deseo que esta clave se envíe como un parámetro GET o POST en lugar de un encabezado de cookie.

Mi pregunta ahora es: ¿Cómo puedo almacenar información de sesión (es decir, un estado) en un servlet de Scalatra sin cookies pero solo un parámetro como identificador?

Hasta ahora intenté usar el sistema de archivos para almacenar toda la información de la sesión, pero esto es demasiado lento e innecesario porque las sesiones solo duran unos segundos.

(La seguridad no es un problema)

Respuesta

5

Descubrí cómo puedo hacerlo.

En cada servlet de Scalatra, tengo acceso al global servletContext que implementa la interfaz javax.servlet.ServletContext. Puedo usar sus dos métodos setAttribute(x: String, y: Any) y getAttribute(x : String) para almacenar información sobre mis sesiones, donde x es mi identificador único e y es la información de la sesión codificada como una clase de caso Session.

Efectivamente tengo los siguientes:

def storeSession(key : String, session : Session) { 
    servletContext.setAttribute(attributePrefix + key, session) 
} 

def loadSession(key : String) : Session = { 
    val session = servletContext.getAttribute(attributePrefix + key) 
    if (session != null) { 
     session match { 
      case s : Session => s 
      case _ => null 
     } 
    } else { 
     null 
    } 
} 

De esta manera puedo mantener un estado en el servidor, sin el uso de cookies, sólo un único identificador único que el cliente tiene que ofrecer como valor GET.

Supongo que esta técnica se puede aplicar a cualquier servlet en Java y Scala que proporcione una instancia de ServletContext, no solo Scalatra.

+0

Esta es la solución rápida, sencilla y predeterminada para almacenar "datos de sesión" cuando se trata de un entorno de servlets Java, justo lo que estaba buscando. –

+0

¿Cómo obtendrás la llave? ¿Se generará para cada solicitud? ¿Cómo identifica la sesión? – Rajeev

+0

La clave se genera para cada sesión nueva (no para todas las solicitudes) usando un generador de números aleatorios en otro lugar del código en mi caso. Se puede usar cualquier identificador que sea único. – Waboodoo

1

Buena pregunta.

En lugar de almacenar el estado en el disco y el rendimiento que eso conlleva, ¿qué hay de almacenar en la memoria a la Redis?

Hay un Scala implementation por debasishg, un pesado en la comunidad de Scala, que puede encajar en la factura.

En el lado sin estado de la valla, en Spray, por ejemplo, esto me fue sugerido como un medio alternativo para mantener el estado del servidor; es decir, almacenar el identificador de cookies del cliente en la caché en memoria vs. confiar en HttpSession