如何为每个用户会话存储实例对象?
我有一门课来模拟一个复杂的算法。该算法旨在逐步运行。我需要为每个用户实例化这个类的对象。每个用户都应该能够逐步推进他们的实例。
如何为每个用户会话存储实例对象?
我有一门课来模拟一个复杂的算法。该算法旨在逐步运行。我需要为每个用户实例化这个类的对象。每个用户都应该能够逐步推进他们的实例。
您只能将对象存储在缓存中。为此,对象必须是可序列化的。在会话中,您可以将密钥(必须是字符串)存储到缓存中。如果从缓存中删除对象(与会话超时相同),请确保您的代码仍然有效。它在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()
这是在会话中保存“对象”的方法。基本上,您将对象序列化/反序列化为 JSON 并将其存储在 cookie 中。
来自播放文档: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.
您可以将任何对象放入缓存中,如下例所示(在此示例中来自文档http://www.playframework.org/documentation/1.1.1/controllers#session,您使用 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);
}
因为它是一个缓存,而不是一个会话,所以您必须考虑到数据可能不再可用,并且有某种手段可以从某个地方再次检索它(在这种情况下是 Message 模型)
无论如何,如果您有足够的内存并且它涉及与用户的短暂交互,则数据应该在那里,如果不是,您可以将用户重定向到向导的开头(您正在谈论某种向导页面,对?)
请记住,play 是无状态的 share-nothing 方法,实际上根本没有 session,它只是通过 cookie 处理它,这就是它只能接受大小有限的字符串的原因