Как хранить объект (не строку) в сессии в Play Framework?

StackOverflow https://stackoverflow.com/questions/1694828

Вопрос

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

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

Что я хочу сделать, так это извлечь пользовательский объект из DB в логин пользователей и сохранить его в сеансе, чтобы я мог получить к нему доступ к шаблонам и т. Д. (У меня есть некоторые методы в классе пользователей, которые мне нужно позвонить, чтобы настроить пользовательский интерфейс ), но если я помесчу пользовательский объект, воспроизведение вызывает его метод ToString и поместит его на сеанс.

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

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

Есть ли способ использовать сеанс на стороне сервера с Play? Мне не нужна функциональность Rest для этого проекта, поэтому, насколько мне известно, приложение может сэкономить состояние ...

Это было полезно?

Решение

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

Другие советы

Я думаю, ты должен взглянуть на

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

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

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

Список обсуждений Play Framework в группах Google очень активен, и вы обычно получаете ответ через пару дней, максимум ...

Другой вариант - преобразовать ваши объекты в 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, это не так безопасно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top