Question

J'ai un projet pour l'école et je dois utiliser Java. Récemment, je trouve cadre de jeu et je veux essayer de l'utiliser. Il est assez facile pour un démarrage rapide, mais je suis tombé sur un problème avec la session.

Être apatride par sa nature, le jeu envoie session entière à l'utilisateur dans cookie et il reçoit sur demande suivante, il ne permet que peu de données en session.

Ce que je veux faire est d'aller chercher l'objet utilisateur de DB lors de la connexion de l'utilisateur, et le garder en session, pour que je puisse y accéder à partir de modèles et ainsi de suite (j'ai quelques méthodes dans la classe d'utilisateur que je dois appeler pour pour personnaliser l'interface utilisateur), mais si je mets objet utilisateur, le jeu appelle sa méthode toString et met en audience.

J'ai trouvé que méthode recommandée est de mettre plus grande quantité de données dans le cache, mais je ne sais pas comment y accéder à partir du modèle (je suppose que je pourrais faire avec méthode annotation @Before et ajouter l'utilisateur à renderArgs, mais cela ne semble pas très propre pour moi). Un autre problème est que le cache a vie limitée, donc mon objet peut disparaître.

Est-ce que quelqu'un a une expérience avec ce genre de problèmes?

Est-il possible d'utiliser la session côté serveur avec le jeu? Je ne suis pas besoin d'une fonctionnalité de repos pour ce projet, donc, en ce qui me concerne, l'application peut enregistrer l'état ...

Était-ce utile?

La solution

Utilisez sérialisation Java sérialiser un hashmap à un fichier ou à la base de données. Nom du fichier ou de la colonne id après un identifiant unique que vous stockez dans le cookie de l'utilisateur. Ensuite, placez l'objet utilisateur dans le hashmap avant sérialisez le hashmap. Maintenant, vous avez un magasin persistant que vous pouvez accéder. Lorsque le cadre oublie l'objet utilisateur ou toute autre information de session, vous pouvez désérialiser le hashmap. Puis écrire quelques méthodes statiques, objet statique SessionDB.get (id String, String key) et SessionDB.put (id String, String key, Object value). J'utilise cette méthode sur mon cadre maison pour stocker les informations de session sur une petite batterie de serveurs. Bien sûr, j'utilise la base de données, et non pas un système de fichiers.

Autres conseils

Je pense que vous devriez jeter un oeil à

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

vous pouvez rechercher

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

la liste de discussion cadre de jeu à des groupes Google est très actif, et vous obtenez généralement une réponse dans quelques jours, au plus ...

Une autre option est de convertir vos objets en JSON. J'ai créé simple Util pour cela et utilisé FlexJSON à mes serialise objets 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);
    }

}

NOTE: Vous devrez gérer le nettoyage après votre travail et garder à l'esprit que comme il est stocké dans le cookie, il est pas aussi sûr

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top