2009-11-07 8 views
11

Ich habe ein Projekt für die Schule und ich muss Java verwenden. Vor kurzem habe ich das Framework gefunden und möchte es benutzen. Es ist einfach genug für einen schnellen Start, aber ich stieß auf ein Problem mit der Sitzung.Wie Objekt (nicht String) in Sitzung im Play-Framework zu speichern?

Da es von Natur aus staatenlos ist, sendet play die gesamte Sitzung an den Benutzer in cookie und empfängt sie bei der nächsten Anfrage, sodass nur eine begrenzte Datenmenge in der Sitzung zulässig ist.

Was ich tun möchte, ist Benutzerobjekt aus der DB bei Benutzeranmeldung abzurufen, und es in Sitzung zu halten, so dass ich von Vorlagen usw. zugreifen konnte (Ich habe einige Methoden in Benutzerklasse, die ich aufrufen muss Um die Benutzerschnittstelle anzupassen, aber wenn ich User-Objekt setze, ruft play seine toString-Methode auf und setzt diese in die Sitzung.

Ich empfand, dass die empfohlene Möglichkeit ist, eine größere Menge an Daten in den Cache zu stellen, aber ich weiß nicht, wie ich auf die Vorlage zugreifen kann (ich denke, ich könnte eine Methode mit @Before Annotation erstellen und userArgs hinzufügen scheint mir nicht sehr sauber zu sein). Ein weiteres Problem ist, dass der Cache eine begrenzte Lebensdauer hat, sodass mein Objekt verschwinden kann.

Hat jemand Erfahrung mit dieser Art von Problemen?

Gibt es eine Möglichkeit, serverseitige Sitzung mit spielen zu verwenden? Ich brauche keine REST-Funktionalität für dieses Projekt, so kann die Anwendung meines Wissens den Status speichern ...

Antwort

3

Verwenden Sie Java-Serialisierung, um eine Hashmap in eine Datei oder in die Datenbank zu serialisieren. Benennen Sie die Datei oder die ID-Spalte nach einem eindeutigen Bezeichner, den Sie im Cookie des Benutzers speichern. Dann setze das User-Objekt in die hashmap, bevor du die hashmap serialisierst. Jetzt haben Sie einen dauerhaften Speicher, auf den Sie zugreifen können. Wenn das Framework das Benutzerobjekt oder andere Sitzungsinformationen vergisst, können Sie die Hashmap deserialisieren. Schreiben Sie dann einige statische Hilfsmethoden, static Object SessionDB.get (String-ID, String-Schlüssel) und SessionDB.put (String-ID, String-Schlüssel, Objektwert). Ich verwende diese Methode in meinem selbst erstellten Framework, um Sitzungsinformationen über eine kleine Serverfarm zu speichern. Natürlich benutze ich die Datenbank, kein Dateisystem.

1

Eine andere Möglichkeit ist, Ihre Obje umzuwandeln cts in JSON. Ich habe dafür ein einfaches Util erstellt und mit FlexJSON meine Objekte in JSON serialisiert.

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); 
    } 

} 

HINWEIS: Sie erhalten die Reinigung nach Ihrer Arbeit verwalten haben und denken Sie daran, dass, da diese in der Cookie gespeichert wird, ist es nicht so sicher ist.