2009-11-07 27 views
11

我有一個學校項目,我必須使用Java。最近我發現了遊戲框架,我想嘗試使用它。快速入門很容易,但我遇到了會話問題。如何在會話框架中存儲對象(不是字符串)?

由於它的本質是無狀態的,play通過cookie向用戶發送整個會話並在下一次請求時接收它,因此它只允許會話中有限的數據量。

我想要做的是從用戶登錄數據庫中獲取用戶對象,並保持它在會話中,所以我可以從模板等訪問它(我有一些方法在用戶類,我需要調用爲了自定義用戶界面),但如果我把用戶對象,播放調用它的toString方法,並把它放在會話中。我發現推薦的方法是將更大量的數據放入緩存,但我不知道如何從模板訪問它(我想我可以使用@Before註釋創建方法並將用戶添加到renderArgs,但是對我來說似乎不是很乾淨)。另一個問題是Cache有限的生命週期,所以我的對象可能會消失。

有沒有人有這種問題的經驗?

有什麼方法可以使用服務器端會話?我不需要此項目的REST功能,所以,就我而言,應用程序可以保存狀態...

回答

3

使用Java序列化將Hashmap序列化爲文件或數據庫。在您存儲在用戶Cookie中的唯一標識符後命名文件或ID列。然後,在序列化散列映射之前,將用戶對象放在散列映射中。現在你有一個你可以訪問的持久存儲。當框架忘記User對象或任何其他會話信息時,您可以反序列化Hashmap。然後編寫一些靜態幫助器方法,靜態對象SessionDB.get(String id,String key)和SessionDB.put(String id,String key,Object value)。我在我自制的框架中使用這種方法來將會話信息存儲在小型服務器場中。當然,我使用數據庫,而不是文件系統。

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中,它是不是安全。

相關問題