объектный сеанс в playframework

Как я могу сохранить объект экземпляра для сеанса пользователя?

У меня есть класс для моделирования сложного алгоритма. Этот алгоритм предназначен для пошагового выполнения. Мне нужно создать экземпляр объектов этого класса для каждого пользователя. Каждый пользователь должен иметь возможность шаг за шагом продвигать свой экземпляр.

4 ответов


вы можете хранить только объекты в кэше. Для этого объекты должны быть сериализуемыми. В сеансе вы можете сохранить ключ (который должен быть строкой) в кэше. Убедитесь, что ваш код все еще работает, если объект был удален из кэша (так же, как тайм-аут сеанса). Это объясняется в http://www.playframework.org/documentation/1.0.3/cache. Надеюсь, это решит вашу проблему.


для хранения значений в сеансе:

//first get the user's session
//if your class extends play.mvc.Controller you can access directly to the session object
Session session = Scope.Session.current();
//to store values into the session
session.put("name", object);

Если вы хотите аннулировать / очистить объект сеанса

session.clear()

из игровой документации:http://www.playframework.org/documentation/1.1.1/cache

Play has a cache library and will use Memcached when used in a distributed environment.

If you don’t configure Memcached, Play will use a standalone cache that stores data in the JVM heap. Caching data in the JVM application breaks the “share nothing” assumption made by Play: you can’t run your application on several servers, and expect the application to behave consistently. Each application instance will have a different copy of the data.

вы можете поместить любой объект в кэш, как в следующем примере (в этом примере из dochttp://www.playframework.org/documentation/1.1.1/controllers#session, вы используете сеанс.getId() для сохранения сообщений для каждого пользователя)

public static void index() {
    List messages = Cache.get(session.getId() + "-messages", List.class);
    if(messages == null) {
        // Cache miss
        messages = Message.findByUser(session.get("user"));
        Cache.set(session.getId() + "-messages", messages, "30mn");
    }
    render(messages);
}

поскольку это кэш, а не сеанс, вы должны учитывать, что данные больше не могут быть доступным и иметь некоторое средство, чтобы получить его еще раз из somehere (модель сообщения, в этом случае)

в любом случае, если у вас достаточно памяти, и это включает в себя короткое взаимодействие с пользователем, данные должны быть там, и в случае, если это не так, вы можете перенаправить пользователя в начало мастера (вы говорите о какой-то странице мастера, верно?)

иметь в виду, что играть, с ним без гражданства долю ничего, правда не sessión на всех, под ним просто обрабатывает его через cookies, поэтому он может принимать только строки ограниченного размера


вот как вы можете сохранять объекты в сессии. В принципе, вы сериализовать/десериализовать объекты в JSON и хранить его в cookie.

https://stackoverflow.com/a/12032315/82976