Как хранить объект (не строку) в сессии в Play Framework?
-
18-09-2019 - |
Вопрос
У меня есть проект для школы, и я должен использовать 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
Список обсуждений 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, это не так безопасно.