プレイフレームワークでセッションでオブジェクト(文字列ではなく)を保存する方法は?

StackOverflow https://stackoverflow.com/questions/1694828

質問

私は学校のプロジェクトを持っていて、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/browse_thread/thread/3d6946ad0b00303b/188e1b272d91408d?lnk=gst&q=store+object+ in+session#188e1b272d91408d

ここで検索することもできます

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に保存されているため、それほど安全ではないことに留意する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top