セッションデータを格納する2つの方法をテストしました。
static final String
として)"user"-> UserObject
「設定」->リスト
...
"sessionObject"-> SessionObject
そして、私のSessionObject
には、属性としてUserObject
と設定のリストが含まれています。これはかなり単純な例ですが、20以上の属性があると想像してください。
私が2番目のアプローチで見る利点はそれです:
final static String
のセットを作成する必要はありませんcast
する必要があります)私がやり過ぎた問題はありますか?または、ベストプラクティスに反するものはありますか?
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);
}
}
}
同じ質問がある場合:Weblogicなどのアプリケーションサーバーで、クラスタリングとセッションレプリケーションを行う場合。セッションは、変更されると他のサーバーにコピーされます。このコピーをトリガーするために、サーバーはセッション内のオブジェクトの参照をチェックし、変更が検出されるとレプリケーションが行われるようです。そのため、他を含む1つのオブジェクトのみを使用すると、コピーがトリガーされない場合があります。
未検証。