プレイフレームワークでセッションでオブジェクト(文字列ではなく)を保存する方法は?
-
18-09-2019 - |
質問
私は学校のプロジェクトを持っていて、Javaを使用する必要があります。最近、私はプレイフレームワークを見つけました、そして私はそれを使用しようとしたいです。簡単にスタートするのは簡単ですが、セッションで問題に遭遇しました。
その性質上無力であるPlayは、Cookieのユーザーにセッション全体を送信し、次のリクエストでそれを受け取るため、セッションでは限られた量のデータのみが可能になります。
私がやりたいのは、ユーザーログイン時にDBからユーザーオブジェクトを取得し、セッションに保持することです。そうすれば、テンプレートなどからアクセスできます(UIをカスタマイズするために電話する必要があるユーザークラスにいくつかの方法があります。 )、しかし、私がユーザーオブジェクトを置くと、再生されるプレイはそのtoStringメソッドを呼び出し、それをセッションに置きます。
推奨される方法は、より多くのデータをキャッシュに入れることですが、テンプレートからアクセスする方法がわかりません(@before Annotationでメソッドを作成し、ユーザーをRenderArgsに追加できると思いますが、それはあまり見えません私にはきれいに)。別の問題は、キャッシュの寿命が限られているため、私のオブジェクトが消える可能性があることです。
誰かがこの種の問題を経験していますか?
プレイでサーバーサイドセッションを使用する方法はありますか?このプロジェクトには休憩機能は必要ありませんので、私が懸念している限り、アプリケーションは状態を救うことができます...
解決
Javaシリアル化を使用して、ハッシュマップをファイルまたはデータベースにシリアル化します。ユーザーのCookieに保存する一意の識別子にちなんで、ファイルまたはID列に名前を付けます。次に、ハッシュマップをシリアル化する前に、ユーザーオブジェクトをハッシュマップに入れます。これで、アクセスできる永続的なストアができました。フレームワークがユーザーオブジェクトまたはその他のセッション情報を忘れた場合、ハッシュマップをゆるくすることができます。次に、いくつかの静的ヘルパーメソッド、静的オブジェクトsessiondb.get(string id、string key)およびsessiondb.put(string id、string key、object value)を書きます。自家製のフレームワークでこの方法を使用して、小さなサーバーファームにセッション情報を保存します。もちろん、ファイルシステムではなくデータベースを使用しています。
他のヒント
私はあなたが見るべきだと思います
ここで検索することもできます
http://groups.google.com/group/play-framework
Google Groupsでのプレイフレームワークディスカッションリストは非常に活発であり、通常、せいぜい数日で応答が得られます...
別のオプションは、オブジェクトを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に保存されているため、それほど安全ではないことに留意する必要があります。