2009-11-07 7 views
11

Ho un progetto per la scuola e devo usare Java. Recentemente ho trovato il framework di gioco e voglio provare ad usarlo. È abbastanza facile per un avvio rapido, ma ho avuto un problema con la sessione.Come memorizzare l'oggetto (non una stringa) nella sessione nel framework di gioco?

Essendo per sua natura stateless, play invia l'intera sessione all'utente nel cookie e lo riceve alla successiva richiesta, quindi consente solo una quantità limitata di dati nella sessione.

Quello che voglio fare è recuperare l'oggetto User dal DB al login utente, e tenerlo in sessione, così ho potuto accedervi dai template e così via (ho alcuni metodi in User class che ho bisogno di chiamare per personalizzare l'interfaccia utente), ma se metto l'oggetto Utente, riproduci il suo metodo toString e lo mette in sessione.

Ho trovato che il modo consigliato è di inserire una quantità maggiore di dati in Cache, ma non so come accedervi dal modello (credo che potrei fare un metodo con @Before annotazione e aggiungere utente a renderArgs, ma che non mi sembra molto pulito). Un altro problema è che la cache ha una durata limitata, quindi il mio oggetto può scomparire.

Qualcuno ha esperienza con questo tipo di problemi?

C'è un modo per utilizzare la sessione lato server con riproduzione? Non ho bisogno della funzionalità REST per questo progetto, quindi, per quanto mi riguarda, l'applicazione può salvare lo stato ...

risposta

3

Utilizzare Serializzazione Java per serializzare una Hashmap in un file o nel database. Assegna un nome al file o alla colonna id dopo un identificativo univoco che memorizzi nel cookie dell'utente. Quindi inserisci l'oggetto User nell'hashmap prima di serializzare l'hashmap. Ora hai un archivio persistente a cui puoi accedere. Quando il framework dimentica l'oggetto User o qualsiasi altra informazione di sessione, è possibile deserializzare Hashmap. Quindi scrivere alcuni metodi di supporto statici, Object SessionDB.get statici (ID stringa, Chiave stringa) e SessionDB.put (ID stringa, Chiave stringa, Valore oggetto). Io uso questo metodo sul mio framework casalingo per archiviare le informazioni di sessione su una piccola server farm. Certo che uso il database, non un file system.

1

Un'altra opzione è quella di convertire il tuo oggetto cts in JSON. Ho creato un semplice Util per questo e ho usato FlexJSON per serializzare i miei oggetti in 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: Dovrete gestire la pulizia dopo il lavoro e tenere a mente che, poiché questo viene memorizzato in un cookie, non è così sicuro.

Problemi correlati