【问题标题】:How to store object (not string) in session in play framework?如何在游戏框架的会话中存储对象(不是字符串)?
【发布时间】:2009-11-07 23:41:47
【问题描述】:

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

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

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

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

有人遇到过这类问题吗?

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

【问题讨论】:

    标签: java session caching playframework


    【解决方案1】:

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

    【讨论】:

      【解决方案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框架讨论列表很活跃,一般一两天就能收到回复,顶多……

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2013-08-18
          • 1970-01-01
          • 1970-01-01
          • 2014-05-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-02
          相关资源
          最近更新 更多