如何在play框架中的会话中存储对象(不是字符串)?

时间:2009-11-07 23:41:47

标签: java session caching playframework

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

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

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

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

有没有人遇到过这种问题?

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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群组中的游戏框架讨论列表非常活跃,您通常会在几天内得到回复,最多...

答案 2 :(得分: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中,因此不太安全。