2009-11-07 13 views
11

Tengo un proyecto para la escuela y tengo que usar Java. Recientemente encontré Play Framework y quiero intentar usarlo. Es bastante fácil para un comienzo rápido, pero tuve un problema con la sesión.Cómo almacenar objetos (no cadenas) en sesión en el marco de juego?

Al ser apátrida por naturaleza, play envía toda la sesión al usuario en la cookie y la recibe en la próxima solicitud, por lo que solo permite una cantidad limitada de datos en sesión.

Lo que quiero hacer es buscar Objeto de usuario desde la base de datos en el inicio de sesión de usuario y mantenerlo en sesión, para poder acceder desde plantillas y así sucesivamente (tengo algunos métodos en la clase de usuario que necesito llamar para personalizar la interfaz de usuario), pero si pongo el objeto Usuario, reproducir llama a su método String y lo pone en sesión.

Encontré que la manera recomendada es poner una mayor cantidad de datos en la memoria caché, pero no sé cómo acceder a ella desde la plantilla (supongo que podría hacer un método con @Antes de la anotación y agregar usuario a renderArgs, pero eso no me parece muy limpio). Otro problema es que Cache tiene una vida útil limitada, por lo que mi objeto puede desaparecer.

¿Alguien tiene experiencia con este tipo de problemas?

¿Hay alguna forma de usar la sesión del servidor con el juego? No necesito la funcionalidad REST para este proyecto, por lo que, en lo que a mí respecta, la aplicación puede guardar el estado ...

Respuesta

3

Use Java Serialization para serializar un Hashmap en un archivo o en la base de datos. Asigne un nombre al archivo o columna de ID después de un identificador único que almacene en la cookie del usuario. A continuación, coloque el objeto User en el hashmap antes de serializar el hashmap. Ahora tiene una tienda persistente a la que puede acceder. Cuando el marco olvida el objeto Usuario o cualquier otra información de sesión, puede deserializar el Hashmap. A continuación, escriba algunos métodos estáticos de ayuda, el objeto estático SessionDB.get (String id, String key) y SessionDB.put (String id, String key, Object value). Uso este método en mi framework casero para almacenar información de sesión en una pequeña granja de servidores. Por supuesto que uso la base de datos, no un sistema de archivos.

1

Otra opción es convertir su obje cts en JSON. Creé un Util simple para esto y usé FlexJSON para serializar mis objetos en JSON.

import play.Logger; 
import play.mvc.Http; 
import play.mvc.Http.Session; 
import flexjson.JSONDeserializer; 
import flexjson.JSONSerializer; 

public class SessionManager { 

private static JSONSerializer s = new JSONSerializer(); 

    public static void addSession(String key, Object value) { 

     if(value != null) { 
      Session session = Http.Context.current().session(); 
      session.put(key, s.deepSerialize(value)); 
     } else { 
      Logger.info("Value for " + key + " is null"); 
     } 
    } 

    public static <T> T get(String key) { 

     Session session = Http.Context.current().session(); 
     final String value = session.get(key); 

     if (value == null) { 
      return null; 
     } 

     return new JSONDeserializer<T>().deserialize(value); 
    } 

} 

NOTA: Vas a tener que gestionar la limpieza de su trabajo y después de tener en cuenta que, dado que esta se almacena en la cookie, que no es tan seguro.

Cuestiones relacionadas