Как хранить объект (не строку) в сеансе в игровой среде?

У меня есть проект для школы, и я должен использовать Java. Недавно я нашел play framework, и я хочу попытаться его использовать. Это достаточно просто для быстрого запуска, но у меня возникла проблема с сеансом.

Будучи не имеющим гражданства по своей природе, игра отправляет всю сессию пользователю в файл cookie и получает ее при следующем запросе, поэтому она позволяет использовать только ограниченный объем данных в сеансе.

То, что я хочу сделать, - это получить объект User из базы данных при входе пользователя в систему и сохранить его в сеансе, чтобы я мог получить к нему доступ из шаблонов и т.д. (у меня есть некоторые методы в классе User, которые мне нужно вызвать в порядке для настройки пользовательского интерфейса), но если я помещаю объект User, воспроизведение вызывает его метод toString и помещает его в сеанс.

Я нашел, что рекомендуется использовать большой объем данных в Cache, но я не знаю, как получить к нему доступ из шаблона (я думаю, я мог бы сделать метод с @Before аннотацией и добавить пользователя в renderArgs, но это делает не кажется мне очень чистым). Другая проблема заключается в том, что Cache имеет ограниченное время жизни, поэтому мой объект может исчезнуть.

Есть ли у кого-нибудь опыт с такими проблемами?

Можно ли использовать сеанс на стороне сервера с игрой? Мне не нужны функции REST для этого проекта, поэтому, насколько мне известно, приложение может сохранять состояние...

Ответ 1

Используйте сериализацию Java для сериализации Hashmap в файле или в базе данных. Назовите столбец файла или идентификатора после уникального идентификатора, который вы храните в cookie пользователя. Затем поместите объект User в хэш-карту, прежде чем сериализовать хэш-карту. Теперь у вас есть постоянный магазин, к которому вы можете получить доступ. Когда структура забывает объект User или любую другую информацию сеанса, вы можете десериализовать Hashmap. Затем напишите некоторые статические вспомогательные методы, статический объект SessionDB.get(String id, String key) и SessionDB.put(String id, String key, Object value). Я использую этот метод на своей домашней структуре для хранения информации о сеансе на небольшой ферме серверов. Конечно, я использую базу данных, а не файловую систему.

Ответ 2

Думаю, вам стоит взглянуть на

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

вы также можете найти здесь

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

список обсуждения игровой структуры в группах google очень активен, и вы обычно получаете ответ через пару дней, самое большее...

Ответ 3

Другой вариант - преобразовать ваши объекты в JSON. Я создал простой Util для этого и использовал FlexJSON для сериализации моих объектов в 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);
    }

}

ПРИМЕЧАНИЕ. Вам придется управлять очисткой после вашей работы и помнить, что, поскольку она хранится в файле cookie, это не так безопасно.