如何将对象(不是字符串)存储在play框架中?
-
18-09-2019 - |
题
我有一个学校的项目,我必须使用Java。最近,我找到了游戏框架,我想尝试使用它。快速开始很容易,但是我遇到了会话问题。
播放本质上是无状态的,将整个会话发送给cookie中的用户并按照下一个请求接收,因此它仅允许会话中的数据有限。
我要做的是从用户登录时从db中获取用户对象,并将其保持在会话中,以便我可以从模板等等(我有一些我需要调用的方法来访问它),但是如果我放置用户对象,请播放调用其tostring方法并将其放入会话中。
我发现建议的方法是将大量的数据放入缓存中,但是我不知道如何从模板访问它(我想我可以用@be Forefore进行注释并将用户添加到Renderargs,但这似乎不是很非常对我很干净)。另一个问题是缓存寿命有限,因此我的对象可能会消失。
有人在这种问题上有经验吗?
有什么方法可以将服务器端会话与Play一起使用?我不需要此项目的REST功能,因此,就我而言,应用程序可以保存状态...
解决方案
使用java序列化将哈希姆普序列化到文件或数据库。在您存储在用户的cookie中的唯一标识符之后,将文件或ID列命名。然后在序列化哈希姆普之前将用户对象放在哈希姆普中。现在,您拥有一个可以访问的持久商店。当框架忘记用户对象或任何其他会话信息时,您可以对哈希图进行估算。然后编写一些静态助手方法,静态对象sessiondb.get(字符串ID,字符串键)和sessiondb.put(字符串ID,字符串键,对象值)。我在自制框架上使用此方法将会话信息存储在小型服务器农场上。当然,我使用数据库,而不是文件系统。
其他提示
我想你应该看看
您也可以在这里搜索
http://groups.google.com/group/play-framework
Google组的游戏框架讨论列表非常活跃,通常您通常会在几天内得到答复,最多最多...
另一个选择是将您的对象转换为JSON。我为此创建了一个简单的效果,并使用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中,因此它不那么安全。