我有一个学校的项目,我必须使用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/browse_thread/thread/3d6946ad0b00303b/188e1b272d91408d?

您也可以在这里搜索

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中,因此它不那么安全。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top