11

学校向けのプロジェクトがあり、Javaを使用する必要があります。最近、Play Frameworkを見つけて、使ってみたいと思います。クイックスタートには十分簡単ですが、セッションで問題が発生しました。

その性質上ステートレスであるため、playはセッション全体をCookieでユーザーに送信し、次のリクエストで受信するため、セッションで許可されるデータの量は限られています。

私がやりたいのは、ユーザーログイン時にDBからUserオブジェクトをフェッチし、それをセッションに保持して、テンプレートなどからアクセスできるようにすることです(UIをカスタマイズするために呼び出す必要のあるUserクラスのメソッドがいくつかあります)が、Userオブジェクトを配置すると、playはそのtoStringメソッドを呼び出し、それをセッションに配置します。

推奨される方法は、大量のデータをキャッシュに入れることですが、テンプレートからデータにアクセスする方法がわかりません(@Beforeアノテーションを使用してメソッドを作成し、renderArgsにユーザーを追加できると思いますが、それはあまりよくないようです私にきれい)。もう1つの問題は、キャッシュの有効期間が限られているため、オブジェクトが表示されなくなる可能性があることです。

誰かがこの種の問題を経験したことがありますか?

プレイでサーバーサイドセッションを使用する方法はありますか?このプロジェクトにはREST機能は必要ないので、私に関する限り、アプリケーションは状態を保存できます...

4

3 に答える 3

4

Javaシリアル化を使用して、ハッシュマップをファイルまたはデータベースにシリアル化します。ユーザーのCookieに保存する一意の識別子にちなんでファイルまたはID列に名前を付けます。次に、ハッシュマップをシリアル化する前に、Userオブジェクトをハッシュマップに配置します。これで、アクセスできる永続ストアができました。フレームワークがUserオブジェクトまたはその他のセッション情報を忘れた場合は、ハッシュマップを逆シリアル化できます。次に、静的ヘルパーメソッド、静的オブジェクトSessionDB.get(文字列ID、文字列キー)およびSessionDB.put(文字列ID、文字列キー、オブジェクト値)を記述します。自家製のフレームワークでこのメソッドを使用して、小さなサーバーファームにセッション情報を保存します。もちろん、私はファイルシステムではなくデータベースを使用しています。

于 2009-11-08T23:29:49.027 に答える
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

グーグルグループのプレイフレームワークディスカッションリストは非常に活発で、通常、せいぜい数日で応答があります...

于 2009-12-06T17:40:28.770 に答える
1

もう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に保存されるため、安全性が低いことに注意してください。

于 2012-08-20T04:35:07.793 に答える