11

我有一个学校项目,我必须使用 Java。最近我找到了play framework,我想尝试使用它。快速入门很容易,但我遇到了会话问题。

由于本质上是无状态的,play 在 cookie 中将整个会话发送给用户,并在下一次请求时接收它,因此它只允许会话中的有限数据量。

我想要做的是在用户登录时从数据库中获取用户对象,并将其保持在会话中,这样我就可以从模板等中访问它(我在用户类中有一些方法需要调用以自定义 UI ),但如果我放置 User 对象,play 会调用它的 toString 方法并将其放入会话中。

我发现推荐的方法是将大量数据放入缓存中,但我不知道如何从模板访问它(我想我可以使用 @Before 注释创建方法并将用户添加到renderArgs,但这似乎不是很对我干净)。另一个问题是缓存的生命周期有限,所以我的对象可能会消失。

有没有人有这种问题的经验?

有什么方法可以在游戏中使用服务器端会话吗?我不需要这个项目的 REST 功能,所以,就我而言,应用程序可以保存状态......

4

3 回答 3

4

使用 Java 序列化将 Hashmap 序列化为文件或数据库。以您存储在用户 cookie 中的唯一标识符命名文件或 id 列。然后在序列化 hashmap 之前将 User 对象放入 hashmap。现在您有了一个可以访问的持久性存储。当框架忘记 User 对象或任何其他会话信息时,您可以反序列化 Hashmap。然后编写一些静态辅助方法,静态对象SessionDB.get(String id, String key) 和SessionDB.put(String id, String key, Object value)。我在我的自制框架上使用这种方法在一个小型服务器场上存储会话信息。当然我使用的是数据库,而不是文件系统。

于 2009-11-08T23:29:49.027 回答
2

我想你应该看看

http://groups.google.com/group/play-framework/browse_thread/thread/3d6946ad0b00303b/188e1b272d91408d?lnk=gst&q=store+object+in+session#188e1b272d91408d

你也可以在这里搜索

http://groups.google.com/group/play-framework

google群里的play框架讨论列表很活跃,一般几天就有回复,顶多……

于 2009-12-06T17:40:28.770 回答
1

另一种选择是将您的对象转换为 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 中,因此不那么安全。

于 2012-08-20T04:35:07.793 回答