11 Stimmen

Wie speichert man ein Objekt (keine Zeichenfolge) in einer Sitzung im Play Framework?

Ich habe ein Projekt für die Schule und muss Java verwenden. Vor kurzem habe ich Play Framework gefunden und möchte versuchen, es zu verwenden. Es ist einfach genug für einen schnellen Start, aber ich stieß auf ein Problem mit der Sitzung.

Da das Spiel von Natur aus zustandslos ist, sendet es die gesamte Sitzung in einem Cookie an den Benutzer und empfängt sie bei der nächsten Anfrage, so dass es nur eine begrenzte Menge an Daten in der Sitzung zulässt.

Was ich tun möchte, ist User-Objekt aus DB auf Benutzer-Login zu holen, und halten Sie es in Sitzung, so dass ich es von Vorlagen und so weiter zugreifen könnte (ich habe einige Methoden in User-Klasse, die ich brauche, um UI anpassen aufrufen), aber wenn ich User-Objekt, Play ruft seine toString-Methode und legt das in Sitzung.

Ich habe herausgefunden, dass der empfohlene Weg darin besteht, eine größere Datenmenge in den Cache zu legen, aber ich weiß nicht, wie ich von der Vorlage darauf zugreifen kann (ich schätze, ich könnte eine Methode mit der @Before-Annotation erstellen und den Benutzer zu den renderArgs hinzufügen, aber das erscheint mir nicht sehr sauber). Ein weiteres Problem ist, dass Cache hat begrenzte Lebensdauer, so dass mein Objekt verschwinden kann.

Hat jemand Erfahrung mit dieser Art von Problemen?

Gibt es eine Möglichkeit, eine serverseitige Sitzung mit Play zu verwenden? Ich brauche keine REST-Funktionalität für dieses Projekt, also kann die Anwendung, soweit ich betroffen bin, den Zustand speichern...

4voto

Jason M Punkte 106

Verwenden Sie Java Serialization, um eine Hashmap in eine Datei oder in die Datenbank zu serialisieren. Benennen Sie die Datei- oder id-Spalte nach einer eindeutigen Kennung, die Sie im Cookie des Benutzers speichern. Fügen Sie dann das User-Objekt in die Hashmap ein, bevor Sie die Hashmap serialisieren. Jetzt haben Sie einen dauerhaften Speicher, auf den Sie zugreifen können. Wenn das Framework das User-Objekt oder andere Sitzungsinformationen vergisst, können Sie die Hashmap deserialisieren. Dann schreiben Sie einige statische Hilfsmethoden, static Object SessionDB.get(String id, String key) und SessionDB.put(String id, String key, Object value). Ich verwende diese Methode in meinem selbstgebauten Framework, um Sitzungsinformationen über eine kleine Serverfarm zu speichern. Natürlich verwende ich die Datenbank, nicht ein Dateisystem.

2voto

opensas Punkte 56212

Ich denke, Sie sollten einen Blick auf

http://groups.google.com/group/play-framework/browse_thread/thread/3d6946ad0b00303b/188e1b272d91408d?lnk=gst&q=store+Objekt+in+Sitzung#188e1b272d91408d

Sie können auch hier suchen

http://groups.google.com/group/play-framework

Die Play Framework-Diskussionsliste bei Google Groups ist sehr aktiv, und man erhält in der Regel innerhalb von ein paar Tagen eine Antwort, höchstens...

1voto

Jay Q. Punkte 4951

Eine andere Möglichkeit besteht darin, Ihre Objekte in JSON zu konvertieren. Ich habe dafür ein einfaches Util erstellt und FlexJSON verwendet, um meine Objekte in JSON zu serialisieren.

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 müssen sich um die Reinigung nach der Arbeit kümmern und bedenken, dass diese nicht so sicher ist, da sie in einem Cookie gespeichert wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X