web-dev-qa-db-ja.com

HTTPセッション:単一のオブジェクトまたは複数のオブジェクト?

セッションデータを格納する2つの方法をテストしました。

  • クラシック:1つのキー、1つのオブジェクト(およびすべてのキーはクラスのstatic final Stringとして)

"user"-> UserObject

「設定」->リスト

...

  • オブジェクトが1つしかないアプローチ

"sessionObject"-> SessionObject

そして、私のSessionObjectには、属性としてUserObjectと設定のリストが含まれています。これはかなり単純な例ですが、20以上の属性があると想像してください。

私が2番目のアプローチで見る利点はそれです:

  • セッションが空であることを確認するには、キーを1つだけ削除する必要があります
  • キーを作成するために面倒なfinal static Stringのセットを作成する必要はありません
  • 取得するオブジェクトのタイプがわかります(キーを使用してcastする必要があります)

私がやり過ぎた問題はありますか?または、ベストプラクティスに反するものはありますか?

3

1つのキー、1つのオブジェクトは、アプリサーバーとの相互作用や可能なセッションレプリケーションテクニックに関してより予測可能になります。 「最終的な静的文字列のセット」が必要であるという意味がわかりません。セッションキーは任意の方法で管理できます。

20個の設定があるとします。おそらく、設定クラスに設定名の列挙があるとします。少し間接的にセッションを取得/設定できます:

class Preferences {

    private static final SESSION_KEY_PREFIX = Preferences.class.getName()+'.';

    enum Name {
        LOCALE,
        ...
    }

    static String get(HttpSession session, Name name) {
        return (String)session.getAttribute(SESSION_KEY_PREFIX + name.name());
    }

    static void set(HttpSession session, Name name, String value) {
        session.setAttribute(SESSION_KEY_PREFIX + name.name(), value);
    }

    static void clear(HttpSession session) {
        for(Name name : Name.values()) {
            session.removeAttribute(SESSION_KEY_PREFIX + name.name());
        }
    }
}

次に、列挙型に追加するだけで設定を追加でき、セッションとのすべての特定の対話がカプセル化されます。

この例は非常に簡単なので、Preferencesクラス自体も、個別の「Name」列挙型なしで列挙型になることもできます。次のいずれかになります。

enum Preference {
    LOCALE,
    ....;

    private final String sessionKey = Preference.class.getName()+'.'+name();

    String get(HttpSession session) {
        return (String)session.getAttribute(sessionKey);
    }

    void set(HttpSession session, String value) {
        session.setAttribute(sessionKey, value);
    }

    static void clear(HttpSession session) {
        for(Preference pref : Preference.values()) {
            session.removeAttribute(pref.sessionKey);
        }
    }
}
1
Dan Armstrong

同じ質問がある場合:Weblogicなどのアプリケーションサーバーで、クラスタリングとセッションレプリケーションを行う場合。セッションは、変更されると他のサーバーにコピーされます。このコピーをトリガーするために、サーバーはセッション内のオブジェクトの参照をチェックし、変更が検出されるとレプリケーションが行われるようです。そのため、他を含む1つのオブジェクトのみを使用すると、コピーがトリガーされない場合があります。

未検証。

0